2013-05-15 2 views
3

У меня проблема с десеризацией Protobuf-net. Я сериализую List<>, но когда я десериализую возвращенный List<>, он не идентичен первому. Отсутствуют данные. Я не понимаю, почему.Deserializing другой Список с protobuf-net

инициализирую мой List<> в СУУ

public ctr() 
{ 
    DateTime date = new DateTime(2012 , 12, 03); ; 
    LkVisiteurIdDTO visitid= new LkVisiteurIdDTO(10, 11, 12); 
    PurgeDateTimeDTO datetime= new PurgeDateTimeDTO(date, true); 
    ContractProtoBuf proto = new ContractProtoBuf(); 

    for (int i = 0; i < 5; i++) 
    { 
     proto.m_Index = i + 1; 
     proto.m_TechnicalKey = "m_TechnicalKey" + i; 
     proto.m_LogicalKey = visitid; 
     proto.m_PurgeTime = datetime; 

     protoContractList.Add(proto); 
    } 

} 

public byte[] serialization() 
{ 
    MemoryStream ms = new MemoryStream(); 
    try 
    { 
     Serializer.Serialize(ms, protoContractList); 
     arr = ms.ToArray(); 
     return arr; 
    } 
    catch 
    { 
     Console.WriteLine("La sérialisation protobuf a échoué"); 
     return null; 
    } 
    finally 
    { 
     ms.Close(); 
    } 

} 

public List<ContractProtoBuf> deserialization() 
{ 
    MemoryStream ms = new MemoryStream(arr,false); 
    try 
    {    
     listeRetour = Serializer.Deserialize<List<ContractProtoBuf>>(ms); 
     return (listeRetour); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine("La désérialisation protobuf a échoué"); 
     return null; 
    } 
    finally 
    { 
     ms.Close(); 
    } 
} 

Так что мой вопрос заключается в том, чтобы иметь такой же результат?


Вот моя структура

[ProtoContract] 
public struct ContractProtoBuf 
{ 
    [ProtoMember(1)] 
    public int m_Index; 

    [ProtoMember(2)] 
    public string m_TechnicalKey; 

    [ProtoMember(3)] 
    public LkVisiteurIdDTO m_LogicalKey; 

    [ProtoMember(4)] 
    public PurgeDateTimeDTO m_PurgeTime; 
} 

создать список ContractProtoBuf и добавить данные со значениями «которые не имеют последствий.»

public ctr() 
    { 
DateTime date = new DateTime(2012 , 12, 03); ; 

for (int i = 0; i < 5; i++) 
{ 
    LkVisiteurIdDTO visitid= new LkVisiteurIdDTO(10, 11, 12); 
    PurgeDateTimeDTO datetime= new PurgeDateTimeDTO(date, true); 
    ContractProtoBuf proto = new ContractProtoBuf(); 
    proto.m_Index = i + 1; 
    proto.m_TechnicalKey = "m_TechnicalKey" + i; 
    proto.m_LogicalKey = visitid; 
    proto.m_PurgeTime = datetime; 

    protoContractList.Add(proto); 
}  

}

сериализовать мой список, который получает Byte [], и когда я десериализации Byte [], список возврата не содержит те же значения в типа PurgeDateTimeDTO и LkVisiteurIdDTO.

В списке возвращенной я нахожу DATETIME {01/01/0001 0:00:00} и visitid {0,0,0} Однако m.Index и m_Technicalkey имеют хорошее значение

+1

Очень сложно помочь, не видя пример данных, которые вы сериализуете, или какие различия. Это действительно помогло бы, если бы вы могли создать короткую, но * полную * программу, которая демонстрирует проблему. –

+0

Re your edit: вы говорите, что 'PurgeDateTimeDTO' и' LkVisiteurIdDTO' не содержат одинаковых значений ... но вы на самом деле не включили те, которые я могу воспроизвести. Я искренне заинтересован в том, чтобы помочь вам найти проблему (как автор библиотеки, я хочу, чтобы люди преуспели), но я не могу помочь без контекста. –

ответ

0

Вы надеваете» t показать DTO, но если я предполагаю, что ContractProtoBuf является class, то вы каждый раз добавляете экземпляр. Точно так же вы добавляете то же самое каждый раз при посещении. Как правило, я бы ожидать, чтобы они были разными, например:

public ctr() 
{ 
    DateTime date = new DateTime(2012 , 12, 03); ; 

    for (int i = 0; i < 5; i++) 
    { 
     LkVisiteurIdDTO visitid= new LkVisiteurIdDTO(10, 11, 12); 
     PurgeDateTimeDTO datetime= new PurgeDateTimeDTO(date, true); 
     ContractProtoBuf proto = new ContractProtoBuf(); 
     proto.m_Index = i + 1; 
     proto.m_TechnicalKey = "m_TechnicalKey" + i; 
     proto.m_LogicalKey = visitid; 
     proto.m_PurgeTime = datetime; 

     protoContractList.Add(proto); 
    }  
} 

Но, как я говорю, - это невозможно точно сказать, без дополнительной информации. Если вы можете предоставить комплект (т. Е. runnable) пример, я буду рад смотреть дальше.

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