2013-11-01 37 views
2

下面的代碼片段試圖序列化一個項目,並使用它的反序列化是接口。 請給予解釋我如何序列化從接口繼承類型,如在例如無法反序列化接口的類型

class Program 
{ 
static void Main() 
{ 
Item item = new Item { A = 123321 }; 

using (MemoryStream ms = new MemoryStream()) 
{ 
Serializer.Serialize(ms item); 
ms.Position = 0; 
Serializer.Deserialize<IItem>(ms); 
} 
} 
} 


ProtoInclude(100 typeof(Item)) 
public interface IItem 
{ 
int A { get; set; } 
} 

public class Item : IItem 
{ 
ProtoMember(1) 
public int A { get; set; } 
} 

引發錯誤:

The type can't be Updated once a serializer has been produced for test.Item >(test.IItem) 
at ProtoBuf.Meta.RuntimeTypeModel.GetKey(Type type Boolean demand Boolean getBaseKey) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 388 
at ProtoBuf.Meta.RuntimeTypeModel.GetKeyImpl(Type type) in C:\Dev\protobuf-net\protobuf-net\Meta\RuntimeTypeModel.cs:line 362 
at ProtoBuf.Meta.TypeModel.GetKey(Type& type) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 982 
at ProtoBuf.Meta.TypeModel.DeserializeCore(ProtoReader reader Type type Object value Boolean noAutoCreate) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 576 
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source Object value Type type SerializationContext context) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 506 
at ProtoBuf.Meta.TypeModel.Deserialize(Stream source Object value Type type) in C:\Dev\protobuf-net\protobuf-net\Meta\TypeModel.cs:line 488 
at ProtoBuf.Serializer.DeserializeT(Stream source) in C:\Dev\protobuf-net\protobuf-net\Serializer.cs:line 69 
at test.Program.Main() in ... 
+1

錯誤消息告訴你到底是什麼問題...你必須重新創建IItem類型的串行器。此外,你確定Protobuf能夠處理接口? –

+1

爲什麼沒有人讀過例外!它包含了所有你需要的信息...... – Liam

+0

串行器的使用不會假設爲特定類型創建或重新創建串行器 - 它是作爲靜態類中的靜態方法實現的。 – Danyl

回答

2

基本上,在當前時間,對性能/列表界面支持的作品,等 - 但不是工作的根對象。所以你需要一個具體的根類型。除此之外 - 這是基本上有 - 我搬到了ProtoMember(1)的接口,這感覺更自然 - 但是:

using System.IO; 
using ProtoBuf; 

class Program 
{ 
    static void Main() 
    { 
     Item item = new Item { A = 123321 }; 

     var obj = new Wrapper { Item = item }; 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      Serializer.Serialize(ms, obj); 
      ms.Position = 0; 
      IItem iObj = Serializer.Deserialize<Wrapper>(ms).Item; 
      Item cObj = (Item)iObj; 
     } 
    } 
} 

[ProtoContract] 
class Wrapper 
{ 
    [ProtoMember(1)] 
    public IItem Item { get;set; } 
} 

[ProtoContract] 
[ProtoInclude(2, typeof(Item))] 
public interface IItem 
{ 
    [ProtoMember(1)] 
    int A { get; set; } 
} 

[ProtoContract] 
public class Item : IItem 
{ 
    public int A { get; set; } 
} 
相關問題