2014-07-15 4 views

답변

2

protobuf-net에는 불필요한 것으로 보입니다. IgnoreDataMember는 DataContractSerializer에 유용합니다. 기본 동작은 모든 공개 형식을 작성하기 때문입니다. 이 경우 옵트 아웃해야합니다. protobuf-net의 경우 가입해야합니다.

그것은하지 작업하지만, 기본 클래스 멤버를 무시하고

using System; 
using System.IO; 
using System.Runtime.Serialization; 
using ProtoBuf; 

namespace ProtoBufTest 
{ 
    internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var test1 = new Test1() {Value1 = 5, Value2 = 10}; 
      using (var ms = new MemoryStream()) 
      { 
       Serializer.Serialize(ms, test1); 
       ms.Position = 0; 
       var t = Serializer.Deserialize<Test1>(ms); 
       Console.WriteLine(string.Format("Value written without DataMember: {0}", test1.Value2 == t.Value2)); 
      } 

      var test2 = new Test2() {Value1 = 5, Value2 = 10}; 
      using (var ms = new MemoryStream()) 
      { 
       Serializer.Serialize(ms, test2); 
       ms.Position = 0; 
       var t = Serializer.Deserialize<Test2>(ms); 
       Console.WriteLine(string.Format("Value written with IgnoreDataMember: {0}", test2.Value2 == t.Value2)); 
      } 

      var test3 = new Test3() {Value1 = 5, Value2 = 10}; 
      using (var ms = new MemoryStream()) 
      { 
       Serializer.Serialize(ms, test3); 
       ms.Position = 0; 
       var t = Serializer.Deserialize<Test3>(ms); 
       Console.WriteLine(string.Format("Value written with DataMember: {0}", test3.Value2 == t.Value2)); 
      } 

     var test4 = new Test4() { Value1 = 5, Value2 = 10 }; 
     using (var ms = new MemoryStream()) 
     { 
      Serializer.Serialize(ms, test4); 
      ms.Position = 0; 
      var t = Serializer.Deserialize<Test4>(ms); 
      Console.WriteLine(string.Format("Value written with IgnoreDataMember override: {0}", test4.Value2 == t.Value2)); 
     } 

      Console.ReadLine(); 
     } 
    } 

    [DataContract] 
    internal class Test1 
    { 
     [DataMember(Order = 1)] 
     public int Value1 { get; set; } 

     public int Value2 { get; set; } 
    } 

    [DataContract] 
    internal class Test2 
    { 
     [DataMember(Order = 1)] 
     public int Value1 { get; set; } 

     [IgnoreDataMember] 
     public int Value2 { get; set; } 
    } 

    [DataContract] 
    [ProtoInclude(3, typeof(Test4))] 
    internal class Test3 
    { 
     [DataMember(Order = 1)] 
     public int Value1 { get; set; } 

     [DataMember(Order = 2)] 
     public int Value2 { get; set; } 
    } 

    [DataContract] 
    internal class Test4 : Test3 
    { 
     [IgnoreDataMember] 
     public new int Value2 { get; set; } 
    } 
} 

출력 기본 수준에 포함되는 속성 무시 :

값이 DataMember를없이 작성 : 거짓을

값 IgnoreDataMember로 작성 : False

값은 DataMember로 작성 : True

IgnoreDataMember로 작성된 값 : False