2013-08-01 2 views
1

protobuf.net을 통해 추상 예제의 속성을 serialize하고 싶습니다.
이 간단한 예제가 작동하도록 내가 무엇을 변경해야하는지 설명해 주시겠습니까? 베이스 클래스에Protobuff.NET - 추상 기본 클래스의 다른 직렬화

using System; 
using System.IO; 
using ProtoBuf; 
namespace TestProtobuf 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = new ClassB {A = "AAAA", B = "BBBB"}; 
      var memoryStream = new MemoryStream(); 
      Serializer.Serialize(memoryStream,x); 
      var memoryStream2 = new MemoryStream(memoryStream.ToArray()); 
      var y = Serializer.Deserialize<ClassB>(memoryStream2); 
      if (x.A != y.A) 
       Console.Write("Failed"); 
     } 
    } 

    [ProtoContract] 
    public class ClassB:ClassA  
    { 
     [ProtoMember(1)] 
     public string B { get; set; } 
    } 

    [ProtoContract] 
    public abstract class ClassA 
    { 
     [ProtoMember(2)] 
     public string A { get; set; } 
    } 
} 

답변

2

추가 : 기본적으로

[ProtoInclude(1, typeof(ClassB))] 

, XmlSerializer (참조 : [XmlInclude]을)와 같이 DataContractSerializer (참조 : [KnownType]은) - 시리얼 라이저는 서브 클래스에 대해 알 필요가 전진. 가장 쉬운 방법은 속성을 사용하는 것이지만 도 원하는 경우 런타임에 지정할 수 있습니다. (: ClassA12입니다 2A 때문에 사용하지 수 있도록) ClassA에서 다른 키와 충돌하지 않는 -

참고 여기에 1은 어떤 키 (그들은 더 효율적으로 인코딩 바람직 소수)입니다. 키는 단일 클래스 내에서만 고유해야합니다 (상속에서도 다른 클래스 사이가 아님).

관련 문제