2010-09-15 3 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

Я бы хотел дать ему шанс и посмотреть, работает ли это для нас. –

+1

Я сделал патч, он работает хорошо, см. Http://stackoverflow.com/questions/3523225/protobuf-net-and-interface-support для моего сообщения об этом. Нужно было сделать лишь несколько небольших изменений, но у него не было взгляда внимательно взгляда Марка и в нем было отверстие. – wal

+0

@wal - мне пришлось перестроить v1 VM (ничего общего с патчем). Теперь сделаем, так что надеюсь посмотреть на это сейчас. –

Смежные вопросы