3

次のクラスのインスタンスのシリアル化に成功しましたが、次のエラーメッセージが表示された直後に逆シリアル化しようとすると、次のようになります" Invalid field in source data: 0"

私はクラスの下を簡単に見つけるので、それが何を指しているのかわかりません。protobuf-netバージョンを2.00.614(ランタイムバージョン:2.0.50727)に更新しました。

些細なことを見落としているのではないかと思いますか?

[ProtoContract]
public class TimeSeriesProperties 
{
    [ProtoMember(1)]
    public string TimeSeriesName { get; private set; }
    [ProtoMember(2)]
    public string FileName { get; private set; }
    [ProtoMember(3)]
    public string TemplateName { get; private set; }
    [ProtoMember(4)]
    public int PacketLength { get; private set; }
    [ProtoMember(5)]
    public long FileSizeBytes { get; set; }
    [ProtoMember(6)]
    public long NumberRecords { get; set; }
    [ProtoMember(7)]
    public DateTime DateTimeStart { get; set; }
    [ProtoMember(8)]
    public DateTime DateTimeEnd { get; set; }

    public TimeSeriesProperties()
    {

    }

    public TimeSeriesProperties(string timeSeriesName, string fileName, string templateName, int PacketLength)
    {
        this.TimeSeriesName = timeSeriesName;
        this.FileName = fileName;
        this.TemplateName = templateName;
        this.PacketLength = PacketLength;
    }

}

public static byte[] Serialize_ProtoBuf<T>(T serializeThis)
    {
        using (var stream = new MemoryStream())
        {
            ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
            return stream.GetBuffer();
        }
    }

    public static T Deserialize_ProtoBuf<T>(byte[] byteArray)
    {
        using (var stream = new MemoryStream(byteArray))
        {
            return ProtoBuf.Serializer.Deserialize<T>(stream);
        }
    }
4

1 に答える 1

10

私がこれについて見た最も一般的な原因は、単にでの誤った使用GetBuffer()ですMemoryStream。コメントを追加したとき、それはすでに私の予感でしたが、あなたはそれを確認しました:

using (var stream = new MemoryStream())
{
    ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
    return stream.GetBuffer();
}

GetBuffer特大のバッキングバッファを返します。最後にゴミがあります。有効なデータの量であるを記録する限りGetBuffer、を使用することはまったく問題ありません。これにより、潜在的に大きなアレイの余分な割り当てを回避できます。しかし、あなたの場合、より簡単なアプローチは、おそらく適切なサイズのバッファを取得するために使用することです。.LengthToArray()

using (var stream = new MemoryStream())
{
    ProtoBuf.Serializer.Serialize<T>(stream, serializeThis);
    return stream.ToArray();
}
于 2013-01-07T13:40:46.647 に答える