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

本文关键字:一个 列表 protobuf-net 反序列化 | 更新日期: 2023-09-27 18:13:52

我有一个反序列化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.i dex和m_Technicalkey有很好的值

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

您不显示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);
    }    
}

但正如我所说的,没有更多的信息,这是不可能肯定的。如果你能提供一个完整的(即可运行的)的例子,我将很高兴看到进一步