Проблема с 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; }
}

Я не знаю.


Ответы (0 шт):