2014-03-25 59 views
0

此示例代码是我的项目的简化版本,该_lockObject是传统的,不能被删除我有下面的类Json.NET序列化错误

[DataContract(IsReference = true)] 
public class test 
{ 
    [DataMember] 
    private static object _lockObject = new object(); 
    [DataMember] 
    private int num; 
} 

我尝试序列使用Json.NET因为它如下:

StringBuilder sb = new StringBuilder(); 
TextWriter text = new StringWriter(sb); 

var serializer = new JsonSerializer(); 
serializer.TypeNameHandling = TypeNameHandling.Auto; 

serializer.PreserveReferencesHandling = PreserveReferencesHandling.None; 
serializer.NullValueHandling = NullValueHandling.Ignore; 
serializer.TraceWriter = new MemoryTraceWriter(); 
serializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; 

serializer.PreserveReferencesHandling = PreserveReferencesHandling.All; 
serializer.TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full; 

var test = new test(); 
serializer.Serialize(text, test); 

我得到一个错误

错误获取值从 '_lockObject'

如果我从_lockObject删除静态序列化是成功的

+1

为什么你想要序列化一个私有成员,它不包含任何有意义的数据,只用于锁定(我假设?)如果你想序列化名字不好的'num',你应该创建一个属性。 – Jodrell

+0

此示例代码是我的项目的简化版本,_lockObject是遗留的,不能被删除 –

+0

很好,但是,您不需要序列化它。另一个“新对象”,当JSON被反序列化时也可以做到,成员变量不带任何状态。 – Jodrell

回答

1

允许一个锁对象被反序列化成一个坏主意,因为它允许锁定机制被击败。如果您只是在不锁定锁定机制的情况下寻找满足遗留序列化要求的方法,我建议您引入一个虚拟非静态成员来代表序列化和反序列化中的锁定对象。定义类像这个:

[DataContract(IsReference = true)] 
public class test 
{ 
    // DO NOT include this in serialization 
    private static object _lockObject = new object(); 

    // This dummy object stands in for _lockObject for purposes of serialization 
    // but is not referenced elsewhere in the code 
    [DataMember(Name = "_lockObject")] 
    private object dummy = new object(); 

    [DataMember] 
    private int num; 
} 

代码可以继续引用静态_lockObject,而外部世界看到虚拟对象的值来代替,并且是毫无收获。现在_lockObject的值不能通过反序列化无意中改变。

3

的问题是,_lockObject是静态字段。静态字段默认情况下不可序列化。国际海事组织你不应该序列化它。

+0

这是不正确的,没有setter和getter的私人成员也被序列化。另外,如果我从_lockObject中删除静态序列化工作 –

+1

@ Shachaf.Gortler:你说得对。固定。 –