Получить ошибку при десериализации строки в объект, определенный в * .proto?

Обратите внимание, что объект определен в файле proto, а не в общем файле cs. У него другое поведение.

Я использую С #. Часть моего прото-файла:

    message CodeDependency {
        string path = 1;
        DependencyType type = 2;

        enum DependencyType {
            NONE = 0;
            TAR = 1;
            ZIP = 2;
            TAR_GZ = 3;
            DIRECTORY = 4;
        }
    }

И у меня есть строка json:

{"codeDependency": {
                    "path": "/CAP_TEST/job_manager/modules/1c8185d5-2add-4bd4-a332-8b21a6819608/tmpr9z7xinh.tar.gz",
                    "type": "TAR_GZ"
                }}

Я пробовал три способа десериализации:

Newtonsoft.Json.JsonConvert.DeserializeObject<CodeDependency>
CodeDependency.Parser.ParseFrom
ProtoBuf.Serializer.Deserialize<CodeDependency>

Ни один из них не работает. Из сообщения об ошибке кажется, что «TAR_GZ» не может быть десериализован.

Error converting value "TAR_GZ" to type 'Microsoft.ABC.GRPC.Modules.Module+Types+CodeDependency+Types+DependencyType'. Path 'graph.nodes[4].module.codeDependency.type', line 273, position 21. ---> System.ArgumentException: Requested value 'TAR_GZ' was not found

Если я изменю «TAR_GZ» на «TAR», все в порядке. Так, может быть, проблема связана с подчеркиванием в "TAR_GZ"? Есть ли способ решить эту проблему на C #? (Это нормально для python.) Спасибо за вашу помощь!


person user9345277    schedule 29.11.2019    source источник
comment
Попробуйте NewtonsoftJson: nuget.org/packages/Newtonsoft.Json   -  person Max Mustermann    schedule 29.11.2019
comment
@MaxMustermann у него уже есть   -  person Innat3    schedule 29.11.2019
comment
comment
Что вы получите, если сериализуете сообщение protobuf, которое содержит нужные вам данные? (В JSON)   -  person Jon Skeet    schedule 29.11.2019
comment
Спасибо за ваши комментарии. Я пробовал (Newtonsoft.Json) JsonConvert.DeserializeObject. Проблема в следующем: для класса (и перечисления), определенного в общем файле cs, он работает нормально. Но для класса, определенного в * .proto (и скомпилированного в cs с помощью protobuf dll), это не работает. Сообщение об ошибке: Ошибка преобразования значения TAR_GZ в тип «Microsoft.ABC.GRPC.Modules.Module + Types + CodeDependency + Types + DependencyType». Путь 'graph.nodes [4] .module.codeDependency.type', строка 273, позиция 21. --- ›System.ArgumentException: запрошенное значение 'TAR_GZ' не найдено   -  person user9345277    schedule 02.12.2019


Ответы (1)


Я пробовал вашу проблему с NewtonsoftJson и корневым объектом, который работал у меня здесь, мое решение:

    namespace RegexTests
{
    static class StringExtension
    {
        public static T DeserializeJson<T>(this string toSerialize)
        {
            return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(toSerialize, new Newtonsoft.Json.JsonSerializerSettings()
            {
                TypeNameHandling = Newtonsoft.Json.TypeNameHandling.Auto
            });
        }
    }

    class Root
    {
        public CodeDependency CodeDependency { get; set; }
    }

    class CodeDependency
    {
        public string Path { get; set; }
        public DependencyType Type { get; set; }
    }

    enum DependencyType
    {
        NONE = 0,
        TAR = 1,
        ZIP = 2,
        TAR_GZ = 3,
        DIRECTORY = 4,
    }

    class Program
    {


        static void Main(string[] args)
        {
            string json = "{\"CodeDependency\": { \"Path\": \"/CAP_TEST/job_manager/modules/1c8185d5-2add-4bd4-a332-8b21a6819608/tmpr9z7xinh.tar.gz\", \"Type\": \"TAR_GZ\" } }";


            var obj = json.DeserializeJson<Root>();

            Console.WriteLine();
            Console.ReadLine();
        }
    }
}
person Max Mustermann    schedule 29.11.2019
comment
Спасибо, Макс. Я пробовал JsonConvert.DeserializeObject. Для класса (и перечисления), определенного в общем файле cs, он отлично работает. Но для класса, определенного в * .proto (и скомпилированного в cs с помощью protobuf dll), это не работает - person user9345277; 02.12.2019