2010-11-20 102 views
4

如果我尝试序列以下ClassToSerialize类的对象与System.Runtime.Serialization.Json.DataContractJsonSerializerSystem.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject忽略非序列化的属性,而序列化

[DataContract,Serializable] 
public class ClassToSerialize 
{ 
    [NonSerialized] private bool _mf; 
    public bool IsMf 
    { 
     get { return _mf}; 
     set{ _mf = value;} 
    } 

    [DataMember] 
    public char PrimaryExc { get; set; }   
} 

public class TestClass 
{ 
    ClassToSerialize obj = new ClassToSerialize{PrimaryExchange = 'a', NoResults = true}; 
    var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(ClassToSerialize); 
    var ms = new MemoryStream(); 
    serializer.WriteObject(ms, obj); 
    return Encoding.UTF8.GetString(ms.ToArray()); 
} 

返回字符串仍包含IsMf属性及其值。 NOnSerialized属性被忽略。有人可以请建议什么属性使用DataContractJsonSerializer时,以不序列化的一些属性

回答

4

下面的代码为我工作使用(它几乎等同于你的固定一些小的编译错误):

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Json; 
using System.Text; 

class Program 
{ 
    static void Main() 
    { 
     var obj = new ClassToSerialize 
     { 
      PrimaryExc = 'a', 
      NoResults = true 
     }; 

     var serializer 
      = new DataContractJsonSerializer(typeof(ClassToSerialize)); 

     var ms = new MemoryStream(); 

     serializer.WriteObject(ms, obj); 

     Console.WriteLine(Encoding.UTF8.GetString(ms.ToArray())); 
    } 
} 

[DataContract] 
[Serializable] 
public class ClassToSerialize 
{ 
    [NonSerialized] 
    private bool _mf; 

    public bool IsMf 
    { 
     get { return _mf; } 
     set { _mf = value; } 
    } 

    [DataMember] 
    public bool NoResults { get; set; } 

    [DataMember] 
    public char PrimaryExc { get; set; } 
} 

输出:

{"NoResults":true,"PrimaryExc":"a"}

+0

我提高了Darin的答复,因为它更准确,更完整,并且因为误导而降低了这个答案。只有标有[DataMember]的成员才会被序列化,其他成员则不会。不需要您注意到的[NonSerialized]被忽略。 – 2015-06-02 22:20:39

2

不,它不包含它。你一定是搞错了:

[DataContract] 
public class ClassToSerialize 
{ 
    [NonSerialized] 
    private bool _mf; 
    public bool IsMf 
    { 
     get { return _mf; } 
     set{ _mf = value;} 
    } 

    [DataMember] 
    public char PrimaryExc { get; set; }   
} 

class Program 
{ 
    static void Main() 
    { 
     var obj = new ClassToSerialize 
     { 
      PrimaryExc = 'a', 
      IsMf = false 
     }; 
     var serializer = new DataContractJsonSerializer(obj.GetType()); 
     serializer.WriteObject(Console.OpenStandardOutput(), obj); 
    } 
} 

输出:

{"PrimaryExc":"a"} 

备注:你并不需要在你的类[Serializable]属性。这仅适用于binary serialization