using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication3
{
class Program
{
class StringDictionaryConverter : CustomCreationConverter<StringDictionary> {
public override StringDictionary Create(Type objectType)
{
throw new NotImplementedException();
}
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
StringDictionary dict = new StringDictionary();
foreach (var element in array)
{
dict.Add(element.Value<string>("Key"),
element.Value<string>("Value"));
}
return dict;
}
}
static void Main(string[] args)
{
StringDictionary sd = new StringDictionary();
sd.Add("Jeffrey", "32767");
sd.Add("Darkthread", "65535");
//印出StringDicionary內容
Func<StringDictionary, string> dumpStringDictionary = (d) =>
{
List<string> list = new List<string>();
foreach (string k in d.Keys)
list.Add(string.Format("{0}:\"{1}\"", k, d[k]));
return "{" + string.Join(",", list.ToArray()) + "}";
};
//JSON序列化沒問題
var json = JsonConvert.SerializeObject(sd);
Console.WriteLine("JSON({1}bytes)={0}", json, json.Length);
//反序列化會出現錯誤
try
{
var test = JsonConvert.DeserializeObject<StringDictionary>(json);
}
catch (Exception ex)
{
Console.WriteLine("Error: {0}", ex.Message);
}
//加上自訂StringDictionary轉換器後可成功反序列化
var restored = JsonConvert.DeserializeObject<StringDictionary>(json,
new StringDictionaryConverter());
Console.WriteLine("Restored={0}", dumpStringDictionary(restored));
//測試二進位序列化
BinaryFormatter bf = new BinaryFormatter();
byte[] data;
using (MemoryStream ms = new MemoryStream())
{
bf.Serialize(ms, sd);
data = ms.ToArray();
Console.WriteLine("Binary({1}bytes)={0}",
Encoding.UTF8.GetString(data), data.Length);
}
using (MemoryStream msRestore = new MemoryStream(data))
{
restored = bf.Deserialize(msRestore) as StringDictionary;
Console.WriteLine("Restored={0}", dumpStringDictionary(restored));
}
Console.Read();
}
}
}