2013-05-15 35 views
3

我有一個反序列化Protobuf-net的問題。我序列化一個List<>,但是當我反序列化返回的List<>與第一個不相同。缺少數據。 我不明白爲什麼。用protobuf-net反序列化不同列表

我初始化我List<>在CTR

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 []當我反序列化字節[],返回列表中不包含的類型PurgeDateTimeDTO和LkVisiteurIdDTO相同的值。

在返回列表中我發現一個DateTime {01/01/0001 0:00:00}和{visitid 0,0,0} 然而m.Index和m_Technicalkey具有良好的價值

+1

沒有看到你正在序列化的數據的例子,或者有什麼不同之處,很難提供幫助。如果你可以製作一個簡短的*完整的*程序來證明問題,那真的很有幫助。 –

+0

重新編輯:你說'PurgeDateTimeDTO'和'LkVisiteurIdDTO'不包含相同的值......但實際上並沒有包括那些讓我重現的值。我真的有興趣幫助你找到問題(作爲圖書館作者,我希望人們能夠成功) - 但是如果沒有上下文,我是無能爲力的。 –

回答

0

你不」 t顯示DTO,但是如果我假設ContractProtoBufclass,那麼您每次都要添加相同的實例。同樣,您每次都加入相同的訪問。通常情況下,我會期望這些不同,例如:

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); 
    }  
} 

但正如我所說 - 不可能肯定地說沒有更多的信息。如果您可以提供完整(即可運行)示例,我很樂意進一步瞭解。