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");
}