使用 protobuf-net 反序列化不同的列表

Posted

技术标签:

【中文标题】使用 protobuf-net 反序列化不同的列表【英文标题】:Deserializing a different List with protobuf-net 【发布时间】:2013-05-15 08:16:57 【问题描述】:

我在反序列化 Protobuf-net 时遇到问题。我序列化了List<>,但是当我反序列化时,返回的List<> 与第一个不同。缺少数据。 我不明白为什么。

我在 ctr 中初始化我的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 有很好的价值

【问题讨论】:

如果没有看到您正在序列化的数据的示例或差异是什么,这将很难提供帮助。如果你能制作一个简短但完整的程序来演示问题,那将非常有帮助。 重新编辑:您说PurgeDateTimeDTOLkVisiteurIdDTO 不包含相同的值......但您实际上并没有包括那些让我重现它。我真的很想帮助您找到问题(作为图书馆作者,我希望人们成功) - 但如果没有上下文,我就无能为力。 【参考方案1】:

您不显示 DTO,但如果我假设 ContractProtoBufclass,那么您每次都添加 same 实例。同样,您每次都添加相同的 visit。通常,我希望这些会有所不同,例如:

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

但正如我所说 - 如果没有更多信息,就无法确定。如果您能提供一个完整(即可运行)示例,我很乐意进一步了解。

【讨论】:

以上是关于使用 protobuf-net 反序列化不同的列表的主要内容,如果未能解决你的问题,请参考以下文章

protobuf-net 可以用来(反)序列化包含异构对象的列表吗?

我可以使用 protobuf-net 在 Mono 中序列化一个对象(包含成员:​​字典、列表...等)并在 MS.NET 中反序列化它,反之亦然?

如何使用 protobuf-net 序列化/反序列化锯齿状/嵌套数组?

使用 protobuf-net 反序列化字典

为啥我不能使用 ProtoBuf-Net 正确反序列化我的对象?

意外的 protobuf-net 序列化程序行为