2015-03-08 3 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

У вас есть простая ошибка. После того, как вы сериализуете/записываете в memstream, .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

Смежные вопросы