3

逆シリアル化 Protobuf-net に問題があります。aList<>をシリアル化しますが、逆シリアル化すると、List<>返されたものは最初のものと同じではありません。不足しているデータがあります。私はなぜなのか理解していない。

私は自分のList<>in 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 [] を取得するリストをシリアライズし、Byte [] をデシリアライズすると、返されるリストのタイプ PurgeDateTimeDTO と LkVisiteurIdDTO に同じ値が含まれません。

戻りリストには、dateTime {01/01/0001 0:00:00} と visitid {0,0,0} がありますが、m.Index と m_Technicalkey には適切な値があります

4

1 に答える 1

0

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 ) 例を提供していただければ、喜んで詳しく調べます。

于 2013-05-15T12:12:40.660 に答える