将字符串反序列化为* .proto中定义的对象时出错,

问题描述 投票:0回答:1

请注意,该对象是在原始文件中定义的,而不是在通用的CS文件中定义的。它具有不同的行为。

我正在使用c#。我的原始文件的一部分是:

    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中可以。)感谢您的帮助!

c# protobuf-net json-deserialization proto
1个回答
0
投票

我已经尝试过使用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();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.