Generics 如何最好地判断泛型类型参数是否可以由protobuf net序列化?

Generics 如何最好地判断泛型类型参数是否可以由protobuf net序列化?,generics,protobuf-net,Generics,Protobuf Net,我正在编写一些定制的通用数据结构。如何确保传入的泛型类型可以由protobuf net序列化?由于protobuf-net不依赖于接口,因此我不能以这种方式约束类型参数。我考虑过在构造函数中对类型进行运行时测试,但我甚至不能使用PrepareSerializer,因为这依赖于作为引用类型的类型。我可以简单地尝试序列化和反序列化,但这看起来很混乱。验证给定泛型类型是否可以序列化的最佳方法是什么?XmlProtoSerializer必须做出类似的决定。例如: static int GetKey(Ty

我正在编写一些定制的通用数据结构。如何确保传入的泛型类型可以由protobuf net序列化?由于protobuf-net不依赖于接口,因此我不能以这种方式约束类型参数。我考虑过在构造函数中对类型进行运行时测试,但我甚至不能使用
PrepareSerializer
,因为这依赖于作为引用类型的类型。我可以简单地尝试序列化和反序列化,但这看起来很混乱。验证给定泛型类型是否可以序列化的最佳方法是什么?

XmlProtoSerializer必须做出类似的决定。例如:

static int GetKey(TypeModel model, ref Type type, out bool isList)
{
    if (model != null && type != null)
    {
        int key = model.GetKey(ref type);
        if (key >= 0)
        {
             isList = false;
             return key;
        }
        Type itemType = TypeModel.GetListItemType(type);
        if (itemType != null)
        {
            key = model.GetKey(ref itemType);
            if (key >= 0)
            {
                isList = true;
                return key;
            }
        }
    }

    isList = false;
    return -1;
}

如果返回负值,则无法序列化。我可以在一个更受支持的
bool CanSerialize(Type)
中提供这一点,如果这有帮助的话?

XmlProtoSerializer必须做出类似的决定。例如:

static int GetKey(TypeModel model, ref Type type, out bool isList)
{
    if (model != null && type != null)
    {
        int key = model.GetKey(ref type);
        if (key >= 0)
        {
             isList = false;
             return key;
        }
        Type itemType = TypeModel.GetListItemType(type);
        if (itemType != null)
        {
            key = model.GetKey(ref itemType);
            if (key >= 0)
            {
                isList = true;
                return key;
            }
        }
    }

    isList = false;
    return -1;
}

如果返回负值,则无法序列化。如果有帮助的话,我可以在一个更受支持的
bool CanSerialize(Type)
中实现这一点。

我将研究
GetKey
方法,但我认为
Serializer.CanSerialize(Type)
将是一个非常棒和有用的方法@Dan我没有忘记这一点-只需要先通过oredev!不用着急。(事实上,你是我认识的唯一一个免费的开发者,他为两天后的延迟道歉。)但是如果你能更新这个答案并在发布时@ping我,那就太棒了!在此期间,我将向您表示怀疑,并接受此答案。=]@Dan已经添加了
CanSerializeContractType
,即
RuntimeTypeModel.Default.CanSerializeContractType(someType)
我将研究
GetKey
方法,但我认为
Serializer.CanSerialize(Type)
将是一个非常棒且有用的方法@Dan我没有忘记这一点-只需要先通过oredev!不用着急。(事实上,你是我认识的唯一一个免费的开发者,他为两天后的延迟道歉。)但是如果你能更新这个答案并在发布时@ping我,那就太棒了!在此期间,我将向您表示怀疑,并接受此答案。=]@Dan添加了
CanSerializeContractType
,即
RuntimeTypeModel.Default.CanSerializeContractType(someType)