1

難読化されたプロジェクトで列挙型を含むクラスをシリアル化しようとすると、次の例外が表示されます。

ProtoBuf.ProtoException: デフォルトの列挙値 X は、オプションのプロパティ Y に対して定義されていません

影響を受けるすべての列挙型を難読化から除外すると、すべて正常に動作しますが、より多くのコード コンテンツを難読化できるように protobuf.net に切り替えたので、より良い解決策があることを願っています。

それで、protobuf.netをめちゃくちゃにするのは難読化ツールですか、それとも列挙型を間違った方法で宣言していますか?

私が試してみました:

    [ProtoContract]
    public enum X
    {
        Y, Z
    }

    [ProtoContract]
    public enum X
    {
        Y=0, Z=1
    }

また、契約がまったくなく、他のいくつかのそれほど明白ではないこともありますが、除外が機能すること以外は何もありません。ところで: protobuf.net を使用するときに列挙型を使用する必要がある例はどこかにありますか?

4

1 に答える 1

0

うーん....私は列挙型の難読化の問題を正直に認識していません。調査するテストケースを準備する必要があります。

使用している難読化ツールを教えていただければ助かります。デフォルト値(つまり、プロパティ定義)をどのように指定しているかを確認することも役立ちます。

[ProtoEnum]列挙型の場合にのみ実際に考慮されることに注意してください([ProtoContract]名前を付けるために使用できますが、.protoファイルを生成している場合を除いてこれは使用されません。これは非常にまれです)-しかし、私はそれを期待していませんこの場合、何かに影響を与えます(これは、「ネットワーク上の」値を.NETとは異なる値に変更するために使用されます)。例として; 私はドキュメントに遅れをとっていることを告白しますが、ここでの列挙型テストケースは典型的な使用法を示しています。

私はこれをIssue59として記録しまし。上記の詳細を教えていただければ(ここか、私にメールしてください-私のプロフィールを参照してください)、調査を試みます。

(あなたが知らなかったなら、私はprotobuf-netの作者です)


私は(.NET Reactorを使用して)次のことを試しましたが、うまくいきました...列挙値のゼロの暗黙のデフォルトが最も疑わしいと思われます。失敗したことを示すテストケースを提供できますか?

using System;
using ProtoBuf;

[ProtoContract]
class Foo {
    static void Main() {
        Foo foo = new Foo { Bar = MyEnum.B };
        Console.WriteLine(foo.Bar);
        Foo clone = Serializer.DeepClone(foo);
        Console.WriteLine(clone.Bar); // Expect "B"
    }

    [ProtoMember(1)]
    public MyEnum Bar { get; set; }
}
enum MyEnum { A, B, C }
于 2009-06-01T11:50:44.020 に答える