Я использую 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);
}
}
}
Я бы хотел дать ему шанс и посмотреть, работает ли это для нас. –
Я сделал патч, он работает хорошо, см. Http://stackoverflow.com/questions/3523225/protobuf-net-and-interface-support для моего сообщения об этом. Нужно было сделать лишь несколько небольших изменений, но у него не было взгляда внимательно взгляда Марка и в нем было отверстие. – wal
@wal - мне пришлось перестроить v1 VM (ничего общего с патчем). Теперь сделаем, так что надеюсь посмотреть на это сейчас. –