2015-03-08 59 views
1

我有三类:protobuf的不反序列化对象corrctly

[ProtoContract] 
public class Message 
{ 
    [ProtoMember(1)] 
    public int MethodId { set; get; } 
    [ProtoMember(2)] 
    public CustomArgs Arguments { set; get; } 
} 

[ProtoContract] 
public class CustomArgs 
{ 
    [ProtoMember(1)] 
    public int IntVal { set; get; } 
    [ProtoMember(2)] 
    public string StrVal { set; get; } 
    [ProtoMember(3)] 
    public CycleData Cd { set; get; } 
} 

[ProtoContract] 
public class CycleData 
{ 
[ProtoMember(1)] 
public int Id { set; get; } 
[ProtoMember(2, AsReference = true)] 
public CycleData Owner { set; get; }} 

所以,当我创建对象,然后进行序列化和反序列化的Arguments财产留null但一部开拓创新的对象有一个值。示例代码是:

static void Main(string[] args) 
{ 
    CycleData cd = new CycleData() 
    { 
     Id = 5 
    }; 
    cd.Owner = cd; 

    CustomArgs a = new CustomArgs() 
    { 
     IntVal = 5, 
     StrVal = "string", 
     Cd = cd 
    }; 

    Message oldMsg = new Message() 
    { 
     MethodId = 3, 
     Arguments = a 
    }; 

    Stream st = new MemoryStream(); 
    ProtoBuf.Serializer.Serialize(st, oldMsg); 
    var newMsg = ProtoBuf.Serializer.Deserialize<Message>(st); 

} 

所以newMsg.Arguments在反序列化后为空。我做错了什么?

回答

2

您有一个简单的错误。一旦您序列化/写入到记录流,.Pointer将保留在流的末尾。在同一个流上使用后立即反序列化失败,因为在该点之后没有任何要读的内容。只需重置它:

using (Stream st = new MemoryStream()) 
{ 
    ProtoBuf.Serializer.Serialize(st, oldMsg); 
    st.Position = 0;   // point to start of stream 
    var newMsg = ProtoBuf.Serializer.Deserialize<Message>(st); 
} 

我也把流放在一个使用块来处置它。

+1

谢谢!有用! – user2598575 2015-03-08 21:35:35