Csharp类实例序列化反序列化json文件

本文最后更新于 2025-11-16 22:09:02

前言

前段时间使用了net.json保存对象数据。添加完成后,测试发现300多实例数据保存加载json文件,速度比原方式(BinaryFormatter)慢。但是功能加上后也懒再删掉代码了,索性就采用两种方式。怎么说两种方式也比一种多不是?^_^

net.json详细介绍

测试之前需要引用Newtonsoft.Json.dll,可在官网下载最新安装包。本文写作时最新Version 10.0.3

测试类Student

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[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自定义序列化

测试用例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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就不需要,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>));
}

Csharp类实例序列化反序列化json文件
https://njit-77.github.io/2017/10/01/Csharp类实例序列化反序列化json文件/
作者
njit-77
发布于
2017年10月1日
许可协议