2013-02-01 41 views
1

在protobuf-net中進行序列化時,我有例外Unexpected sub-type: UnnamedGameServer.TrapInstance意外的子類型:MyNamespace.MyInheritedClass

這是代碼:

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; } 
} 
+0

我有一種預感'ProtoInclude'各地工作的另一種方式 - 它似乎類似於WCF的'KnownType'和[這個問題](http://stackoverflow.com/questions/947666/what-does- protoinclude-attribute-mean-in-protobuf-net)就是這樣使用它的。你的'MapTrap'類應該包括反序列化器在處理基類型屬性時應該期望的所有子類型。 – millimoose

回答

1

的基類需要被告知的子類,而不是周圍的其他方式。從一個子類中,它是微不足道的尋找基類,因爲這是在運行時容易獲得。

[ProtoContract, ProtoInclude(5, typeof(TrapInstance))] 
public class MapTrap {...} 

[ProtoContract] 
class TrapInstance : MapTrap {...} 
+0

我認爲這是相反的方式。謝謝,這工作 – Pacha