6

最新の protobuf-net (2.0.0.601) に更新した後、System.Version 型の値をシリアル化しようとすると例外が発生します。

[ProtoContract(SkipConstructor=true)]   
public class ServerLoginInfo
{
    [ProtoMember(1)]
    public Version ServerVersion { get; set; }
}

これは、特別なことをしなくても 2.0.0.480 で問題なく動作していました。

新しいバージョンで動作させることは可能ですか、それとも古いバージョンにロールバックする唯一のオプションですか?

(シリアライゼーション/デシリアライゼーションが古い protobuf-net バージョンと下位互換性を持つようにする必要もあります。)

4

2 に答える 2

4

これは、AllowParseableTypes に関連していると思われます。つまり、フォールバックとして静的な Parse メソッドを探すかどうかです。私の記憶では、これは既定のモデルでは有効にできませんが、次のデプロイではその制限を削除すると思います。しかし、今のところ:

var model = TypeModel.Create();
model.AllowParseableTypes = true;

次に、モデルを保存 (および再利用) し、model.Serialize/model.Deserialize を使用します。

このデフォルト モデルの制限を変更すると、次のようになります。

RuntimeTypeModel.Default.AllowParseableTypes = true;
于 2012-11-09T19:36:13.310 に答える
2

AllowParseableTypes オプションを有効にすると、AllowParseableTypes に適用される他の型の一部の構成が無効になるという副作用があるため、代わりに Version のサロゲートを使用することをお勧めします。

詳細はこちら: https://github.com/mgravell/protobuf-net/issues/183

このようにするには、次の初期化子を追加します。

RuntimeTypeModel.Default.Add(typeof(Version), false).SetSurrogate(typeof(VersionSurrogate));

および次のタイプ:

[ProtoContract]
public class VersionSurrogate
{
    [ProtoMember(1)]
    public string Version { get; set; }

    public static implicit operator VersionSurrogate(Version value)
    {
        return new VersionSurrogate
        {
            Version = value.ToString()
        };
    }

    public static implicit operator Version(VersionSurrogate value)
    {
        return System.Version.Parse(value.Version);
    }
}   
于 2016-09-02T20:13:59.540 に答える