2010-09-15 65 views
4

我正在使用protobuf-net r282,当我调用Serialize时,我得到InvalidOperationException错误消息“只能处理数据约定类(以及这样的列表/数组)(错误处理对象) ”。在调用protobuf-net Serializer.Serialize的时候,有问题的对象被转换为接口。有没有办法解决这个问题?基于接口的Protobuf-net序列化

下面的代码:

using System.IO; 
using System.Runtime.Serialization; 
using System.Runtime.Serialization.Formatters.Binary; 
using ProtoBuf; 
using System; 

namespace EventStore.Core 
{ 
public interface Message 
{ 
} 

public interface Event : Message 
{ 
    Guid Id { get; set; } 

    int Version { get; set; } 
} 

[DataContract] 
public class InventoryItemCreated : Event 
{ 
    [DataMember(Order = 1)] 
    public Guid Id { get; set; } 

    [DataMember(Order = 2)] 
    public int Version { get; set; } 

    [DataMember(Order = 3)] 
    public string Name { get; set; } 

    public InventoryItemCreated(Guid id, string name) 
    { 
     Id = id; 
     Name = name; 
    } 

    public InventoryItemCreated() 
    { 

    } 
} 

public class DefaultSerializer 
{ 
    private readonly IFormatter formatter = new BinaryFormatter(); 

    public byte[] Serialize<T>(T graph) where T : class 
    { 
     if (default(T) == graph) 
      return null; 

     using (var stream = new MemoryStream()) 
     { 
      this.Serialize(graph, stream); 
      return stream.ToArray(); 
     } 
    } 

    public virtual void Serialize<T>(T graph, Stream output) where T : class 
    { 
     this.formatter.Serialize(output, graph); 
    } 

    public T Deserialize<T>(byte[] serialized) where T : class 
    { 
     if (null == serialized || 0 == serialized.Length) 
      return default(T); 

     using (var stream = new MemoryStream(serialized)) 
      return this.Deserialize<T>(stream); 
    } 

    public virtual T Deserialize<T>(Stream input) where T : class 
    { 
     return (T)this.formatter.Deserialize(input); 
    } 
} 

public class ProtoBufSerializer : DefaultSerializer 
{ 
    public override void Serialize<T>(T graph, Stream output) 
    { 
     Serializer.Serialize<T>(output, graph); 
    } 

    public override T Deserialize<T>(Stream input) 
    { 
     return Serializer.Deserialize<T>(input); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     ProtoBufSerializer serializer = new ProtoBufSerializer(); 
     InventoryItemCreated item = new InventoryItemCreated(Guid.NewGuid(), "Widget"); 
     byte[] buffer = serializer.Serialize((Message)item); 
    } 
} 

}

回答

0

这是我一直在寻找的 “V2” 的东西,但它是不完整的。我已经为v1发送了一个补丁,可以分享,但我没有严格测试。让我知道你是否想要这个补丁文件。

+0

我愿意试试看看它是否适用于我们。 – 2010-09-16 15:12:22

+1

我做了补丁,它一直运行良好,请参阅http://stackoverflow.com/questions/3523225/protobuf-net-and-interface-support在我的文章上。只需要进行一些小的改动,但是Marc没有用敏锐的目光仔细检查它,并且在它上面挖了一个洞 – wal 2010-09-17 14:01:41

+0

@wal - 我不得不重建我的v1虚拟机(与修补程序无关)。现在完成了,所以希望现在看看这个。 – 2010-09-18 07:19:20