私の努力にもかかわらず、はい、以前のビルドの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
ます。より速く、より小さく、古いデータと新しいデータの両方をサポートします。