我正在尝试使用protobuf序列化我的下面的类,但它失败了"对象引用"错误。更多细节如下。通过查看错误详细信息,任何想法可能是错的? 注意:我的用户对象太大,它有很多子对象和属性。所以不要在这里添加User类详细信息。
[ProtoContract]
public class MyPrincipal
{
public MyPrincipal(string Id, int myId)
{
this.Id = Id;
this.MyId = myId;
this.Principals = new Dictionary<MyPrincipalType, User>();
}
[ProtoMember(1)]
public string Id { get; set; }
[ProtoMember(2)]
public int MyId { get; set; }
[ProtoMember(3)]
public Dictionary<MyPrincipalType, User> Principals { get; set; }
public MyPrincipal AddPrincipal(MyPrincipalType principalType, User principalValue)
{
this.Principals.Add(principalType, principalValue);
return this;
}
}
public enum MyPrincipalType
{
Test = 0
}
以下是错误详情:
异常: {&#34;对象引用未设置为对象的实例。&#34;}
ProtoBuf.Serializers.TagDecorator.get_ExpectedType()Inner StrackTrace: 在ProtoBuf.Serializers.DefaultValueDecorator..ctor(TypeModel model,Object defaultValue,IProtoSerializer tail) 在ProtoBuf.Serializers.MapDecorator`3..ctor(TypeModel模型,Type concreteType,IProtoSerializer keyTail,IProtoSerializer valueTail,Int32 fieldNumber,WireType wireType,WireType keyWireType,WireType valueWireType,Boolean overwriteList)
在System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr,Binder binder,Object)中的System.RuntimeMethodHandle.InvokeMethod(Object target,Object []参数,Signature sig,布尔构造函数)外部StackTrace: []参数,CultureInfo文化)在System.Reflection.ConstructorInfo.Invoke(Object []参数)的ProtoBuf.Meta.ValueMember.BuildSerializer()在ProtoBuf.Meta.ValueMember.get_Serializer()在ProtoBuf.Meta.MetaType.BuildSerializer( )ProtoBuf.Meta.Meta上的ProtoBuf.Meta.Meta中的ProtoBuf.Meta.Meta中的ProtoBuf.Meta.Meta上的ProtoBuf.Meta.Meta中的ProtoBuf.Meta.Meta中的ProtoBuf.Meta上的ProtoBuf.Meta中的ProtoBuf.Meta的线程 ProtoBuf.Meta中的ProtoBuf.Meta.TypeModel.Serialize(Stream dest,Object value,SerializationContext context)ProtoBuf.Serializer.Serialize [T](Stream destination,T instance)的ProtoBuf.Meta.Serialize(Stream dest,Object value) / p>
此问题仅适用于最新的nuget版本2.3.0。当我使用版本2.0.0.668时,这很好。
答案 0 :(得分:0)
这是一个库bug,看起来很讨厌。我有logged it as an issue。
有一种解决方法:暂时禁用字典上的“地图”处理 - 将[ProtoMap(DisableMap = true)]
添加到Principals
。代码已修复,应包含在2.3.1中。我将审查2.3.1的其他候选人,并决定保证发送提示 - 将其余部分移至2.3.2(因此我们可以尽快通过此修复发送2.3.1)。