1

我有以下代码,试图反序列化一个“属性”类,它基本上是一个名称/值对,其中值的类型是未知的(对象):

[ProtoContract]
[ProtoInclude(100, typeof(ValueAttr))]
public abstract class BaseAttr
{
    protected BaseAttr(string name) { _name = name; }
    public string Name { get { return _name; } }
    public abstract object Value { get; }
    public abstract ValueAttr Evaluate();
    [ProtoMember(1)]
    private readonly string _name;
}

[Serializable]
[ProtoContract]
public class ValueAttr : BaseAttr
{
    public ValueAttr(string name, object value) : base(name)
    { _value = value; }

    public override ValueAttr Evaluate() { return this; }

    public override object Value { get { return _value; } }
    [ProtoMember(1, DynamicType = true)]
    protected object _value;
}

[Serializable]
public class Attr<T> : ValueAttr
{
    public Attr(string name, T value) : base(name, value) { _value = value; }
}

我想要实现的是原生 .NET 类型的 protobuf-net “原生”序列化,以及所有其他类型的默认二进制 .NET 序列化(当然,假设它们是可序列化的)。我认为DynamicType可以帮助我解决这个问题,直到我发现“动态”部分仅指收缩类型。

什么是最有效的方法(在时间和记忆上)做到这一点?是否使用 protobuf.net 中的ValueWrapper示例?如果是这样,我如何实现默认的 .NET 序列化?

谢谢!

4

1 回答 1

1

protobuf-net 中没有任何可以切换到的BinaryFormatter代码(尽管它确实有一些代码允许它自己使用BinaryFormatter)。但如果这是根对象,你应该能够在序列化时询问模型本身:

var model = RuntimeTypeModel.Default;
if (model.CanSerialize(type))
{
    // TODO: add some kind of token to indicate serializer used
    model.Serialize(dest, obj);
}
else if(type.IsSerializable)
{
    // TODO: add some kind of token to indicate serializer used
    new BinaryFormatter().Serialize(dest, obj);
}
else { /* PANIC!!!! */ }

这对子对象没有帮助;最终,protobuf-net 想要了解模型。

于 2013-05-22T13:35:26.487 回答