Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Protobuf.Net序列化未知类型的数组_C#_Protobuf Net - Fatal编程技术网

C# 使用Protobuf.Net序列化未知类型的数组

C# 使用Protobuf.Net序列化未知类型的数组,c#,protobuf-net,C#,Protobuf Net,我在尝试序列化此数据结构时遇到了一些麻烦: 受保护字符串EngineQualifiedName { 获取{返回引擎==null?null:Engine.AssemblyQualifiedName;} set{Engine=value==null?null:Type.GetTypevalue;} } 公共类型引擎{get;protected set;} 公共字符串方法{get;protected set;} 公共类型[]参数类型{get;protected set;} 显然,问题与参数类型的序列化

我在尝试序列化此数据结构时遇到了一些麻烦:

受保护字符串EngineQualifiedName { 获取{返回引擎==null?null:Engine.AssemblyQualifiedName;} set{Engine=value==null?null:Type.GetTypevalue;} } 公共类型引擎{get;protected set;} 公共字符串方法{get;protected set;} 公共类型[]参数类型{get;protected set;} 显然,问题与参数类型的序列化有关。在阅读stack overflow中的其他类似问题后,我编写了如下格式设置程序:

public static IFormatter Formatter(IEnumerable<Type> paramTypes)
{
    RuntimeTypeModel.Default.Add(typeof(ProtoBufRequest), true).Add(1, "ParameterCompositeValues").Add(2, "EngineQualifiedName").Add(3, "Method");
    var ct = RuntimeTypeModel.Default.Add(typeof(CompositeType), true);         
    var ctType = typeof (CompositeType<>);

    var j = 0;
    foreach (var paramType in paramTypes)
    {
        try
        {
            RuntimeTypeModel.Default.Add(paramType, true);
        }
        catch
        { }

        ct.AddSubType(j + 4, ctType.MakeGenericType(paramType));

        j++;
    }

    return RuntimeTypeModel.Default.CreateFormatter(typeof (ProtoBufRequest));
}
我使用了这些属性和类来屏蔽类型的数组:

private CompositeType[] ParameterCompositeValues
{
    get
    {
        if (ParameterValues == null)
            return null;

        var create = typeof (CompositeType).GetMethod("Create");
        return
            ParameterValues.Select(
                    (t, i) => (CompositeType) create.MakeGenericMethod(ParameterTypes[i]).Invoke(null, new[] {t})).ToArray();
    }
    set
    {
        ParameterValues = value == null ? null : value.Select(v => v.Value).ToArray();
    }
}

[ProtoContract(UseProtoMembersOnly = true)]
internal abstract class CompositeType
{
    protected abstract object ValueImpl { get; set; }

    public object Value
    {
        get { return ValueImpl; }
        set { ValueImpl = value; }
    }


    public static CompositeType<T> Create<T>(T value)
    {
        return new CompositeType<T> {Value = value};
    }
}


[ProtoContract(UseProtoMembersOnly = true)]
internal class CompositeType<T> : CompositeType
{
    [ProtoMember(1)]
    public new T Value { get; set; }

    protected override object ValueImpl
    {
        get { return Value; }
        set { Value = (T) value; }
    }
}
我的问题实际上是,当我尝试序列化泛型类时,例如,一个扬声器,其中T未知,格式化程序面临一些问题,在反序列化过程中,我得到一个空类,其所有值都为null。我做错什么了吗? 泛型类以正确的方式序列化,但如果我尝试以这种方式设置它们,则此消息系统无法正确序列化和反序列化:\


任何帮助都将不胜感激

关于ParameterTypes,System.Type在当前主干中具有直接处理功能,但在发布的dll中不具有直接处理功能-因此您不需要任何其他格式—它使用预先存在的类型序列化,可以通过模型事件选择性地挂接。我要强调,;任何动态子类处理都非常依赖于输入的键。您所描述的不是该工具的经典用例场景。它可能被迫工作,但是!您还需要注意重复,在使用时更改默认模型可能会导致它说不。我有点不清楚问题场景是什么,即具体问题是什么;你能澄清一下吗?听起来像是@MarcGravel用户的问题:23354他是proto方面的专家bufs@MarcGravell哈哈!我还没来得及输入你的名字,你就出现了!!!:-P@MarcGravell:那么你实际上是建议我试试看svn中的代码是否适合我的需要?我正在实现一个消息服务来在Azure中发送序列化数据,ProtoBuf.Net是使其在Windows和Mono中都能工作的最好的序列化解决方案:实际的示例与DataContractSerializer配合使用效果很好,并提供了一些便利,System.Type在当前主干中有直接处理,但在已发布的dll中没有直接处理,因此您不需要任何其他格式—它使用预先存在的类型序列化,可以通过模型事件选择性地挂钩。我要强调,;任何动态子类处理都非常依赖于输入的键。您所描述的不是该工具的经典用例场景。它可能被迫工作,但是!您还需要注意重复,在使用时更改默认模型可能会导致它说不。我有点不清楚问题场景是什么,即具体问题是什么;你能澄清一下吗?听起来像是@MarcGravel用户的问题:23354他是proto方面的专家bufs@MarcGravell哈哈!我还没来得及输入你的名字,你就出现了!!!:-P@MarcGravell:那么你实际上是建议我试试看svn中的代码是否适合我的需要?我正在实现一个消息服务来在Azure中发送序列化数据,ProtoBuf.Net是使其在Windows和Mono中都能工作的最好的序列化解决方案:实际的示例使用DataContractSerializer很好,但有一些便利。