前言 前段時間使用了net.json保存對象數據。添加完成後,測試發現300多實例數據保存載入json文件,速度比原方式(BinaryFormatter)慢。但是功能加上後也懶再刪掉代碼了,索性就採用兩種方式。怎麼說兩種方式也比一種多不是?^_^ net.json "詳細介紹" 1 測試之前需要引用 ...
前言
前段時間使用了net.json保存對象數據。添加完成後,測試發現300多實例數據保存載入json文件,速度比原方式(BinaryFormatter)慢。但是功能加上後也懶再刪掉代碼了,索性就採用兩種方式。怎麼說兩種方式也比一種多不是?^_^
net.json詳細介紹
1 測試之前需要引用Newtonsoft.Json.dll,可在官網下載最新安裝包。本文寫作時最新Version 10.0.3
測試類Student
[JsonObject(MemberSerialization.Fields)]
class Student
{
const int count = 1024;
public Student(int ID, string Name, int Age, string Sex)
{
this.ID = ID;
this.Name = Name;
this.Age = Age;
this.Sex = Sex;
buffer = new byte[count];
for (int i = 0; i < count; i++)
{
buffer[i] = (byte)i;
}
}
byte[] buffer;
int ID { get; set; }
string Name { get; set; }
int Age { get; set; }
string Sex { get; set; }
[JsonIgnore]
IntPtr hwnd;
[OnDeserialized]
private void SetValuesOnDeserialized(StreamingContext context)
{
string stringA = "I seem to be turned around!";
hwnd = System.Runtime.InteropServices.Marshal.StringToHGlobalAnsi(stringA);
}
}
2 序列化對象預設情況下只有公共成員,此類沒有公共成員。故設置特性[JsonObject(MemberSerialization.Fields)]可序列化所有成員。詳細可見MemberSerialization
3 對於Intprt hwnd,標記為[JsonIgnore]表示不進行序列化;當進行反序列化後使用[OnDeserialized]可根據需要重新對其進行賦值 OnDeserializedAttribute 類,對於自定義序列化可參考msdn自定義序列化
測試用例
ArrayList StuModel = new ArrayList()
{
new Student(1,"王小二",18,"男"),
new Student(2,"麗麗",16,"女")
};
using (StreamWriter file = File.CreateText(@"test.json"))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, StuModel);
}
using (StreamReader file = File.OpenText(@"test.json"))
{
JsonSerializer serializer = new JsonSerializer();
var movie2 = (ArrayList)serializer.Deserialize(file, typeof(ArrayList));
for (int i = 0; i < movie2.Count; i++)
{
movie2[i] = JsonConvert.DeserializeObject<Student>(movie2[i].ToString());
}
}
4 測試代碼中集合用ArrayList,故反序列化後需要再次進行轉換,把集合裡面的每個JObject轉換成Student,如果使用List就不需要,如下:
List<Student> StuModel = new List<Student>()
{
new Student(1,"王小二",18,"男"),
new Student(2,"麗麗",16,"女")
};
using (StreamWriter file = File.CreateText(@"test.json"))
{
JsonSerializer serializer = new JsonSerializer();
serializer.Serialize(file, StuModel);
}
using (StreamReader file = File.OpenText(@"test.json"))
{
JsonSerializer serializer = new JsonSerializer();
var movie2 = (List<Student>)serializer.Deserialize(file, typeof(List<Student>));
}