Protobuf net protobuf net-将对象序列化为数组中[ProtoContract]实例的属性
有这样一种类型:Protobuf net protobuf net-将对象序列化为数组中[ProtoContract]实例的属性,protobuf-net,Protobuf Net,有这样一种类型: [ProtoContract(UseProtoMembersOnly=true)] public class ProtoObjectDTO { [ProtoMember(1, DynamicType=true)] public object Value { get; set; } [ProtoMember(2)] public int Order { get; set; } } var sentParams = ProtoBuf.Seriali
[ProtoContract(UseProtoMembersOnly=true)]
public class ProtoObjectDTO
{
[ProtoMember(1, DynamicType=true)]
public object Value { get; set; }
[ProtoMember(2)]
public int Order { get; set; }
}
var sentParams = ProtoBuf.Serializer.Deserialize<ProtoObjectDTO[]>(stream);
这些对象的数组中有多个实例
(以下代码段中的参数)发送到服务:
await client.PostAsync<ProtoObjectDTO[]>(
route, parameters, new ProtoBufFormatter())
.ContinueWith((r) =>
{
r.Result.EnsureSuccessStatusCode();
retVal = true;
});
当检查sentParams并将其与参数进行比较时,
第二个实例中的值只是一个默认实例
第一个实例中的对象类型。这很奇怪。
你能帮我吗?谢谢。我添加了以下测试,测试成功。为了进行调查,似乎有必要提供更多有关所涉及类型的信息(或者理想情况下,测试失败):
你好,马克,我刚刚修复了这个错误。谢谢(也很抱歉)占用您的时间。我正在制作一个通用解决方案,用于在ApiController-s中使用proto buf序列化来启用非REST方法签名。DynamicType=true在本例中与charm类似:)
[ProtoContract]
public class Foo
{
[ProtoMember(3)]
public int A { get; set; }
}
[ProtoContract]
public class Bar
{
[ProtoMember(4)]
public string B { get; set; }
}
public void Execute()
{
var model = TypeModel.Create();
model.AutoCompile = false;
Execute(model, "Runtime");
model.CompileInPlace();
Execute(model, "CompileInPlace");
Execute(model.Compile(), "Compile");
model.Compile("SO17040488", "SO17040488.dll");
PEVerify.AssertValid("SO17040488.dll");
}
private void Execute(TypeModel model, string caption)
{
var args = new[] {
new ProtoObjectDTO { Order = 1, Value = new Foo { A = 123 }},
new ProtoObjectDTO { Order = 2, Value = new Bar { B = "abc" }},
};
var clone = (ProtoObjectDTO[])model.DeepClone(args);
Assert.AreEqual(2, clone.Length, caption + ":length");
Assert.AreEqual(1, clone[0].Order, caption + ":order");
Assert.AreEqual(2, clone[1].Order, caption + ":order");
Assert.IsInstanceOfType(typeof(Foo), clone[0].Value, caption + ":type");
Assert.IsInstanceOfType(typeof(Bar), clone[1].Value, caption + ":type");
Assert.AreEqual(123, ((Foo)clone[0].Value).A, caption + ":value");
Assert.AreEqual("abc", ((Bar)clone[1].Value).B, caption + ":value");
}