ProtoBuf-Net,Open泛型类型序列化/反序列化

时间:2012-02-05 17:00:50

标签: generics protobuf-net

我有以下类型:

Class Command<TData> : Base Where TData : I

在运行时,此类是构建(使用特定的TDATA)和序列化。 我有2个问题(我正在使用V2): 1)当我将此类型添加到运行时模态时:

var meta = this._modal.Add(type, false)
                             .Add(this.GetDMProperties(type).Select(p => p.Name)
                             .ToArray());

我得到以下异常:

  

未处理的异常:System.NullReferenceException:未将对象引用设置为   一个对象的实例。      在ProtoBuf.Meta.TypeModel.ResolveProxies(Type type)中的C:\ Dev \ protobuf-net \ protobuf-net \ Meta \ TypeModel.cs:第952行      在ProtoBuf.Meta.RuntimeTypeModel.FindWithoutAdd(Type type)中的C:\ Dev \ protobuf-net \ protobuf-net \ Meta \ RuntimeTypeModel.cs:第118行      在ProtoBuf.Meta.ValueMember..ctor(RuntimeTypeModel model,Type parentType,Int32 fieldNumber,MemberInfo member,Type memberType,Type itemType,Type defaul)   tType,DataFormat dataFormat,Object defaultValue)在C:\ Dev \ protobuf-net \ protobuf-net \ Meta \ ValueMember.cs:第75行      在ProtoBuf.Meta.MetaType.AddField(Int32 fieldNumber,String memberName,Type itemType,Type defaultType,Object defaultValue)in C:\ Dev \ protobuf-net \ protobu   f-net \ Meta \ MetaType.cs:第1165行      在ProtoBuf.Meta.MetaType.Add(String [] memberNames)中的C:\ Dev \ protobuf-net \ protobuf-net \ Meta \ MetaType.cs:第1046行

2)如果我尝试在启动时跳过它并尝试按需执行,如下所示:

if (this._modal.CanSerializeContractType(objectType) == false)
            {
                this._modal.Add(objectType, false);
                this._modal.CompileInPlace();
            }

CanSerializeContractType返回true,但实际上只有基本数据被序列化。

我的问题是,如果可能的话,在没有在设计时添加所有排列的情况下将此类型添加到模态的做法是什么?

1 个答案:

答案 0 :(得分:0)

我将不得不调查第一个;听起来像一个奇怪的边缘案例bug。然而,你的第二点与我不久前的对话有关 - 结论是我将添加一个在第一次看到类型时被触发的事件。然后,在配置类型时,您将有机会。理论上:简单;我只需要实现它。我会在我的事情清单上“碰撞”这个前锋......

附注:除非您只在单个AppDomain中工作而不是写入磁盘或通过网络或在进程之间发送,否则必须确保您可以可靠地添加属性/ sun类型相同的钥匙。或者更具体地说:eithrr你的GetDMaproperties方法(未显示)需要某种固定顺序,或者你需要LINQ中的OrderBy。也;这很脆弱 - 如果有人添加/删除/重命名属性,键将会改变。