代码之家  ›  专栏  ›  技术社区  ›  Mark J Miller

基于接口的Protobuf网络序列化

  •  4
  • Mark J Miller  · 技术社区  · 15 年前

    我正在使用protobuf net r282,当我调用serialize时,会得到invalidOperationException错误消息“只能处理数据协定类(以及此类类的列表/数组)(错误处理对象)”。在调用protobuf net serializer.serialize时,所讨论的对象已转换到接口。有办法解决这个问题吗?

    代码如下:

    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);
        }
    }
    

    }

    1 回复  |  直到 15 年前
        1
  •  0
  •   Marc Gravell    15 年前

    这是我一直在寻找的“v2”,但它是不完整的。我已经收到了一个v1的补丁,它可以做到这一点,我可以分享,但我还没有严格测试过这一点。如果你想要这个补丁文件,请告诉我。