【发布时间】:2021-08-14 01:35:47
【问题描述】:
当我反序列化 protoc 生成的 C# 对象时,我设置的属性会被清除。任何人都可以帮忙吗?我正在使用Newtonsoft.Json nuget 包。
proto 文件(测试 C# 解决方案中的“SimplifiedProto.proto”)有什么问题吗?
proto文件内容
syntax = "proto3";
option java_multiple_files = true;
option java_outer_classname = "SpreadProtos";
option csharp_namespace = "SpreadProtos";
message Parameters {
oneof instanceOrGroup {
string Instance = 10;
string Algo = 60;
}
}
message Spread {
Parameters parmeters = 10;
}
message Order {
double minFilledPercentage = 10;
Parameters parmeters = 30;
}
message Request {
oneof newRequestOpt {
Spread create = 5;
}
string clientRequestId = 100;
}
C#程序
Request request = new Request()
{
ClientRequestId = "someId",
Create = new Spread()
{
Parmeters = new Parameters()
{
Instance = "someInstanceValue"
}
}
};
string jsonConvertStr = JsonConvert.SerializeObject(request);
Request requestJsonConvert = JsonConvert.DeserializeObject<Request>(jsonConvertStr);
//At this point the value stored in Instanc Prop is lost
谢谢 J
【问题讨论】:
-
明确一点:您是说该值没有正确地通过 JSON.NET 进行往返吗? JSON 字符串在这里是什么样子的? (附带说明:这个 DTO 是为 protobuf 设计的;如果它不适用于 JSON.NET:那可能不是一个巨大的设计目标)
-
嗨,马克,这是正确的。我希望我可以提供使用“protoc.exe”生成的 C# 类,但我无法在此处附加它。但是如果您要使用该工具生成它,并按照上面的代码设置值,请将其序列化,然后反序列化,“ClientRequestId”为空。
-
您确定
ClientRequestId受到影响吗?这是Request的属性。您之前在Instance下谈论过价值,这是一个非常 不同的主张。我会期望ClientRequestId工作正常 - 生成的代码只是一个支持字段和属性 getter 和 setter(带有 null 检查),没有任何条件序列化等 -
对不起,我的意思是“实例”.. 一旦你反序列化,它就消失了.. 如果你熟悉 proto 编译器(protoc),你可以生成类自己尝试。我无法在此处附加该课程..
-
我很熟悉——其实你可以使用我这里的工具生成代码protogen.marcgravell.com——只需将下拉列表改为CSharpProtoc即可获取protoc版本。就个人而言,我更喜欢 protobuf-net 的方法,但我有偏见:)
标签: c# json json.net protocol-buffers proto