2

r249からr282にアップデートしました。dllを置き換える以外は、変更を加えていません。残念ながら、更新前に作成されたオブジェクトの逆シリアル化にはかなり時間がかかります。以前は2秒かかっていたものが、今では5分かかります。

バージョン間で構文に変更はありましたか?サポートされなくなったものはありますか?

私のクラスはすべてProtoContract、ProtoMember、およびProtoIncludeを使用しています。VS2010を実行しています。私に関する限り、プロトコルバッファコードに問題はありませんでした。最新バージョンがあればいいと思ったので、アップグレードしようとしています。

編集-2010.09.09私のオブジェクトのプロパティの1つは、ushortsの配列です。このプロパティがr282で正しくシリアル化/逆シリアル化されていないことに気づきました。配列の結果の値はすべてゼロです。配列には、シリアル化される前(r282)に値がありましたが、逆シリアル化された後(r282)にはありませんでした。

4

1 に答える 1

2

私の努力にもかかわらず、はい、以前のビルドの1つでデータ形式に重大な変更があったことがわかりました。ushortこれは、ある時点での処理から省略されたデータにのみ影響します。これは残念ですが、データが失われることはありません。アクセスするのは少し不便です(現時点では基本的に文字列を介して書き込まれます)。

これが私の提案された回避策です。次のようなメンバーの場合:

[ProtoBuf.ProtoMember(1)]
public ushort[] Data {get;set;}

これを次のように置き換えます。

[ProtoBuf.ProtoMember(1)]
private string[] LegacyData {get;set;}

private bool LegacyDataSpecified { get { return false; } set { } }

/* where 42 is just an unused new field number */
[ProtoBuf.ProtoMember(42, Options = MemberSerializationOptions.Packed)]
public ushort[] Data { get; set; }

[ProtoBuf.ProtoAfterDeserialization]
private void SerializationCallback()
{
    if (LegacyData != null && LegacyData.Length > 0)
    {
        ushort[] parsed = Array.ConvertAll<string, ushort>(
            LegacyData, ushort.Parse);
        if (Data != null && Data.Length > 0)
        {
            int oldLen = parsed.Length;
            Array.Resize(ref parsed, parsed.Length + Data.Length);
            Array.Copy(Data, 0, parsed, oldLen, Data.Length);
        }
        Data = parsed;
    }
    LegacyData = null;
}

これにより、古いスタイルのデータがシリアル化中(シリアル化後)にインポートされLegacyDataてマージされるか、から新しいスタイルのデータが書き込まれDataます。より速く、より小さく、古いデータと新しいデータの両方をサポートします。

于 2010-09-09T05:46:29.050 に答える