意外的子类型:MyNamespace.MyInheritedClass
Posted
技术标签:
【中文标题】意外的子类型:MyNamespace.MyInheritedClass【英文标题】:Unexpected sub-type: MyNamespace.MyInheritedClass 【发布时间】:2013-02-01 21:56:57 【问题描述】:在 protobuf-net 中序列化时出现异常 Unexpected sub-type: UnnamedGameServer.TrapInstance
。
这是代码:
class test
void testMethod(PacketNewTrapResponse packet)
using (var stream = new MemoryStream())
Serializer.SerializeWithLengthPrefix<PacketNewTrapResponse>(stream, (PacketNewTrapResponse)packet, PrefixStyle.Base128);
[ProtoContract]
public class MapTrap
[ProtoMember(1)]
public IntegerVector2 Position;
[ProtoMember(2)]
public int TrapServerID;
[ProtoMember(3)]
public int LocationID;
[ProtoContract, ProtoInclude(1, typeof(MapTrap))]
class TrapInstance : MapTrap
public TrapInstance(TrapProperties trap, SessionCharacter session, int serverTrapId, int locationId, IntegerVector2 position)
TrapServerID = serverTrapId;
Trap = trap;
Position = position;
LocationID = locationId;
OwnerOfTrap = session;
LocationID = locationId;
Position = position;
public SessionCharacter OwnerOfTrap get; set;
public TrapProperties Trap get; set;
【问题讨论】:
我有一种预感ProtoInclude
的工作方式正好相反——它似乎类似于 WCF 的 KnownType
,而 this question 就是这样使用的。你的MapTrap
类应该包括反序列化器在使用基类型的属性时应该期望的所有子类型。
【参考方案1】:
基类需要被告知子类,而不是相反。从子类中查找基类是简单的,因为它在运行时很容易获得。
[ProtoContract, ProtoInclude(5, typeof(TrapInstance))]
public class MapTrap ...
[ProtoContract]
class TrapInstance : MapTrap ...
【讨论】:
如果我不想在基类中声明子类型怎么办?我试过这样做,但没有奏效以上是关于意外的子类型:MyNamespace.MyInheritedClass的主要内容,如果未能解决你的问题,请参考以下文章
可空引用类型意外 CS8629 可空值类型可能为带有临时变量的空