为什么 JSON.NET 不反序列化某些类成员?



假设我有一个简单的类:

[DataContract]
class ClassA
{
[DataMember]
public Stopwatch swMember { get; set; }
[DataMember] 
public SomeEnum enumMember { get; set; }
[DataMember]
public bool boolMember { get; set; }
[DataMember]
public Task taskMember { get; set; }
public ClassA()
{
swMember = new Stopwatch();
}
}
public enum SomeEnum
{
x,y,z
}

我为 A 创建一个对象并为其分配一些值:

ClassA a = new ClassA();
a.swMember.Start();
Thread.Sleep(1000);
a.enumMember = SomeEnum.z;
a.boolMember = true;
a.taskMember = Task.Factory.StartNew(() => "A");

然后我序列化此对象并将其反序列化为另一个对象:

ClassA a1 = JsonConvert.DeserializeObject<ClassA>(JsonConvert.SerializeObject(a));

这是实例"a"的序列化版本的样子:

{"swMember":{"IsRunning":true,"Elapsed":"00:00:07.0445661","ElapsedMilliseconds":7044,"ElapsedTicks":19218028},"enumMember":2,"boolMember":true,"taskMember":{"Result":"A","Id":1,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}}

这就是实例"a1"的样子 图片 1 图片 2那么为什么反序列化版本保留像布尔值或枚举值这样的简单成员,为什么它会重置像秒表和任务值这样的复杂成员呢?

序列化复杂对象时,默认情况下,Json.Net 序列化该对象上的所有公共属性,包括只读属性。 例如,在Stopwatch类上,您将在 JSON 中获得IsRunningElapsedElapsedMillisecondsElapsedTicks的属性。 所有这些都是只读的。

将 JSON 反序列化回对象时,Json.Net 使用默认构造函数(如果可能)构造这些对象的新实例,然后尝试使用公共属性资源库从 JSON 填充它们。 当反序列化程序在 JSON 中找到IsRunningElapsed*属性时,它会注意到Stopwatch类上的相应属性是只读的,无法设置。 所以,它只是跳过它们。 因此,如果检查Stopwatch的反序列化实例,它将看起来好像已被重置。 事实上,它从未启动过 -它是一个新实例,与您序列化的原始实例不同。 与Task对象的想法相同。

在实践中,尝试序列化诸如StopwatchTask之类的东西确实很有意义。 这些类表示暂时性操作,而不是数据。

相关内容

  • 没有找到相关文章

最新更新