protobuf-netでは、次のProtoEnumAttribute
ように列挙のワイヤ形式をオーバーライドできます。
[ProtoContract]
enum MyEnum
{
[ProtoEnum(Value=1)]
Default,
[ProtoEnum(Value=10)]
Foo
}
これらの属性を使用すると、通常はどこにDefault
シリアル化され、どこにシリアル化され、それぞれにシリアル化されるようになります。0
Foo
1
1
10
私がやろうとしているのはProtoBuf.Meta
、 のインターフェイスを使用してこの動作を模倣することです。そのため、列挙に注釈を付ける必要はありません (通常、プロジェクトでそれらを制御しないため)。
protobuf-net のソースを掘り下げて、次の (少し簡略化された) 作業を行うことができました。
var model = RuntimeTypeModel.Create();
var meta = model.Add(enumType, applyDefaultBehaviour: true);
var fields = meta.GetFields();
// Oh god why
var fieldNumber =
typeof(ValueMember).GetField(
"fieldNumber",
System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic
);
List<string> ordered = GetDesiredEnumOrder(enumType);
int equiv = 0;
foreach (var val in ordered)
{
var field = fields.Single(f => f.Name == val);
fieldNumber.SetValue(field, equiv);
equiv++;
}
ただし、これをプライベート (読み取り専用!) フィールドに反映することに依存して出荷することはできません。それは単にトラブルを求めているだけです。
では、protobuf-net で実行時に列挙ワイヤ値をオーバーライドするサポートされている方法はありますか?