2

protobuf-net を使用しようとしていますが、カスタム RuntimeTypeModel で無効にした UseImplicitZeroDefaults を理解するのに問題があります。最初はデフォルトの RuntimeTypeModel を使用していましたが、DefaultValue が指定されていてもブール型のプロパティが複製されていないことに気付きました。

UseImplicitZeroDefaults を false に設定できるようにするカスタム RuntimeTypeModel を作成することで、これを解決しました。ただし、これを false に設定すると、次のエラーが発生します。

ProtoBuf.ProtoException: No wire-value is mapped to the enum

一部の列挙型はゼロベースではないことに注意してください。これが問題を引き起こしている可能性はありますか? ブール値のプロパティと列挙型 (非ゼロとゼロベースの混合) を複製/シリアル化するにはどうすればよいですか?

編集: protobuf-net enum serializationで見つかった情報の一部を使用し、以下を報告できます:

[ProtoMember(10), DefaultValue(SiteType.Partition)]
public SiteType Type { get; set; }

それでも「No wire-value」エラーが発生します。

[ProtoMember(10, IsRequired = true)]
public SiteType Type { get; set; }

それでも「No wire-value」エラーが発生します。

public enum SiteType
{
    Error = 0,
    ...

これは機能しますが、理想的には、列挙型をクリーンなままにしたいと考えています。
おそらく、デフォルト値を指定するよりクリーンな方法は次のとおりです。

[DefaultValue(SiteType.Server)]
public enum SiteType
{
    Server = 1,
    Monkey = 2
    ...
4

1 に答える 1

3

ゼロ以外のすべての列挙型にデフォルトの列挙型を指定することで、この問題を解決しました。シリアル化されるクラスのコンストラクターでデフォルトを指定しました。これは、最も整然としたソリューションであり、追加の protobuf-net 属性は必要ありませんでした。

さらに、ゼロ以外の列挙型プロパティのデフォルト値を明示的に設定することは理にかなっています。

于 2012-12-17T23:45:36.127 に答える