Проблема с Enum при работе с MessagePack
В общем, раньше мы обменивались между серверами JSON'ми и все работало норм. Решили перейти на MessagePack и тут начались проблемы с тем, что этот протокол более привередлив.
Не знаю почему, но так исторически сложилось, что с одного сервера на другой Enum'ы передавались, как строка (с сервера на Java), а на другой стороне (C#) Enum'ы - это Enum'ы. Когда был JSON, то он нормально все переваривал, но MessagePack спотыкается на этом. Типа C# сервер ждет int, а получает строку и MessagePack валится с ошибкой.
Я уже сделал костыли в виде аттрибутов на эти поля, которые не кажутся надежными, но неужели нету никаких решений из коробки?
Так как мне пришлось пилить аттрибут на каждую коллекцию, которую я встречал, а так же nullable значения тоже нужно поособенному обрабатывать...
[MessagePackFormatter(typeof(Common.MessagePack.NullableEnumAsStringFormatter<MapObjectType>))]
В интернете, я что-то ничего не нашел...
Код, который у меня валится:
public static readonly MessagePackSerializerOptions SerializerOptions =
MessagePackSerializerOptions.Standard
.WithResolver(CompositeResolver.Create(
BuiltinResolver.Instance,
StandardResolver.Instance
))
;
static void Main(string[] args)
{
var testClass1 = new TestClass1() { Value = "A" };
var data = MessagePackSerializer.Serialize(testClass1, SerializerOptions);
var testClass2 = MessagePackSerializer.Deserialize<TestClass2>(data, SerializerOptions);
}
[MessagePackObject]
public class TestClass1
{
[Key("Value")]
public string Value { get; set; }
}
[MessagePackObject]
public class TestClass2
{
[Key("Value")]
public MyEnum Value { get; set; }
}
public enum MyEnum
{
[EnumMember(Value = "A")]
A,
[EnumMember(Value = "B")]
B
}
Можно код выше починить, если прописать (что неудобно, так как при добавлении новых энуп полей нужно помнить об этом атрибуте)
[MessagePackFormatter(typeof(EnumAsStringFormatter<MyEnum>))]
Но, как починить этот код:
[MessagePackObject]
class TestClass3
{
[Key("Values")]
public List<string> Values { get; set; }
}
[MessagePackObject]
class TestClass4
{
[Key("Values")]
public List<MyEnum> Values { get; set; }
}
Я не знаю.