5

インラインで true に初期化されたブール値のメンバーを持つ型をシリアル化する場合 - オブジェクトの逆シリアル化では常に値を true として取得します (明らかに、問題は、シリアル化の前にメンバーの実際の値が false だった場合です)。これは逆の場合には発生しません (インラインで false に初期化され、オブジェクト値が true - 他の操作や他のデータ メンバー型も試しましたが、すべて正常に動作します)。

ここにタイプがあります:

[ProtoContract]
public class SomeObject
{
    public SomeObject() {}

    [ProtoMember(1)]
    private bool m_SomeMember = true;

    public bool SomeMember
    {
        get { return m_SomeMember; }
        set { m_SomeMember = value; }
    }
}

コードは次のとおりです。

var stream = new MemoryStream();
var data = new SomeObject() {SomeMember = false};
Serializer.SerializeWithLengthPrefix<SomeObject>(stream, data , PrefixStyle.Base128);
stream.Position = 0;
var deserializedObject = Serializer.DeserializeWithLengthPrefix<SomeObject>(stream, PrefixStyle.Base128);

逆シリアル化されたオブジェクトの値を見ていると、SomeMember の値は true です。インラインメンバーの初期化コードはコンパイラによってデフォルトのctorに挿入される必要があるため、これはあまり意味がありません-そして、私が理解している限り、protobufはctorが呼び出された後にのみメンバーの値を設定する必要がありますそれ以外の場合は可能です) それで、ヘルプ? (マルク?)

4

1 に答える 1

1

デフォルトでは、protobuf-net は暗黙的なゼロのデフォルトを使用します (ゼロfalseと見なされます)。あなたはあなたが何を意味するかを伝えることができます:

[ProtoMember(1), DefaultValue(true)]
private bool m_SomeMember = true;

または、( 経由でRuntimeTypeModel.UseImplicitZeroDefaults) この動作を無効にして、明示的なデフォルトのみが処理されるようにすることもできます。

于 2012-08-20T08:17:49.803 に答える