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

3
我遇到了一个反序列化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的值很好。


1
如果没有看到您正在序列化的数据或差异是什么,那么帮助起来会非常困难。如果您能够编写一个简短但完整的程序来演示问题,那将非常有帮助。 - Jon Skeet
关于您的编辑:您说“PurgeDateTimeDTO”和“LkVisiteurIdDTO”不包含相同的值......但您实际上没有为我提供这些内容以重现它。我真正有兴趣帮助您找到问题(作为图书馆作者,我希望人们成功) - 但是我没有上下文就无法帮助。 - Marc Gravell
1个回答

0

您没有展示DTOs,但是如果我假设ContractProtoBuf是一个class,那么您每次都在添加相同的实例。同样,您每次都在添加相同的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);
    }    
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接