2013-09-15 4 views
6

Protobuf-net, по-видимому, является самым быстрым и для высокопроизводительных задач наиболее рекомендуемой библиотекой сериализации для .NET. Я действительно хочу использовать его, так как мне нужно отправить сотни тысяч объектов по кабелю.документация или альтернативы protobuf-net

Однако у меня возникли проблемы с началом работы. Документация (wiki в github) довольно скудна, особенно для v2.

Каким-то образом вы, ребята, похоже, можете отправиться в библиотеку. Как? Читая источники? Методом проб и ошибок? Или есть некоторые API-документы/учебники, о которых я не знаю? (Я только осведомлен о странице GitHib.)

Спасибо и приветствия,

Jan

P.S .: Мне нужно, чтобы идти с помощью RuntimeTypeModel (POCO без атрибутов).

+0

У вас есть пример модели, которую вы хотели бы сериализовать, для иллюстрации? –

+0

* plug * heres статья, которую я написал, которая может помочь вам начать работу (включая использование v2) http://wallaceturner.com/serialization-with-protobuf-net – wal

ответ

1

В protobuf каждому члену типа требуется идентификационный номер, потому что protobuf основан на число (он не отправляет имена). Таким образом, трюк просто: скажите, какие цифры использовать. Например:

class Customer { 
    public int Id {get;set;} 
    public string Name {get;set;} 
} 

Самый простой способ определить контракт на это будет:

RuntimeTypeModel.Default.Add(typeof(Customer), false).Add("Id", "Name"); 

, который будет связывать Id с 1 и Name с 2. При использовании атрибутов, есть некоторые встроенные «фигуры это сам "код, который я действительно должен разоблачить на неатрибутном API - такие вещи как:

  • сериализуйте все общедоступные поля + свойства в алфавитном порядке
  • сериализации все поля (государственные или негосударственные), в алфавитном порядке

Однако: оба из них довольно просто сделать с отражением. Обратите внимание, что в любом случае использование отражения - хороший способ столкнуться с проблемами, если типы могут измениться в какой-то момент.

Дополнительные функции, которые могут помочь, и которые я могу предоставить более подробную информацию о:

  • типа завод может быть определен (глобально или за экземпляр), которые могут быть полезны для предварительного заполнения значений или с использованием пул доступных объектов
  • суррогатные типы могут быть записаны для сложных сценариев - это полезно, когда большая часть модели работает отлично, но один тип слишком эзотеричен, чтобы быть подходящим для сериализации - но можно разработать альтернативный макет для которого вы можете записать код конвертации в обоих направлениях
  • много вещей, которые выглядят l ike «tuple» будет обрабатываться по умолчанию - в частности, если он является публично неизменным и имеет конструктор, который принимает параметры, соответствующие всем публичным членам, - он будет предполагать сериализацию членов в порядке, указанном конструктором
+0

RuntimeTypeModel.Compile() занимает довольно много времени ... около 3 сек для одного добавленного типа с 20 свойствами. Я что-то упускаю? Cheers, Jan – Knack

+0

@Knack I * suspect * много из них - fusion/JIT и т. Д. - У меня есть модель в моей тестовой установке с 20 свойствами 3 мс (не с) на 'Compile()'; и для намеренно сложной модели (801 типов, 1600 свойств) 600 мс на 'компиляцию'. Мне было бы интересно посмотреть, что там происходит. Также обратите внимание: в большинстве случаев вам не нужно * вызывать 'Compile()' - он будет автоматически выполнять компиляцию каждого типа –

+0

Что-то не так с моей настройкой (не уверен, что если бы IntelliTrace активировал выполнение этих прогонов ...). Во всяком случае: теперь я получаю неизменно ожидаемые показатели производительности - с помощью и без компиляции(). Действительно, действительно потрясающий и впечатляющий. Благодаря! – Knack

6

Поскольку вы также просили об альтернативах ...

нет необходимости для украшения атрибутов не была одной из причин, за создание Migrant, быстрой библиотеки сериализации с простой API.В библиотеке есть некоторые идеи, которые также присутствуют в protobuf (поэтому мы более или менее едины с точки зрения скорости и размера), но в то же время пытается решить разные проблемы. Среди особенностей, отличных от protobuf, существует разница между пустым и нулевым набором, а целая сериализация - это ссылка, основанная на ссылках и значении, основанном на значениях (ну, вы также можете рассматривать ссылку как особый вид значения). README в github должен уметь отвечать на большинство ваших вопросов; требуется ли более подробная информация, просто спросите.

Простой сценарий пользовательского объекта сериализации:

var stream = new MyCustomStream(); 
var myComplexObject = new MyComplexType(complexParameters); 
var serializer = new Serializer(); 

serializer.Serialize(myComplexObject, stream); 

stream.Seek(0, SeekOrigin.Begin); 

var myDeserializedObject = serializer.Deserialize<MyComplexType>(stream); 

Обратите внимание, что ожидается тип в Deserialize только используется, чтобы иметь хороший тип времени компиляции в десериализованный объекта, вы можете использовать общий object, а также.

Отказ от ответственности: Я - один из разработчиков.

0

Другой вариант: Dasher (доступно через NuGet).

Это простой, быстрый и легкий сериализатор и десериализатор для .NET, который работает на типах C# без каких-либо атрибутов или других украшений.

var stream = new MemoryStream(); 

// serialise to stream 
new Serialiser<Holiday>().Serialise(stream, christmas); 

stream.Position = 0; 

// deserialise from stream 
var christmas = new Deserialiser<Holiday>().Deserialise(stream); 

Он использует отражение излучателя для создания высоко оптимизированных функций сериализации и десериализации во время выполнения. Основополагающая кодировка - это MsgPack, которая сама описывает, так немного больше, чем protobuf на проводе, но это означает, что вы можете декодировать любое сообщение, которое вы получаете, включая имена, типы и значения свойств.

Отказ от ответственности: Я написал библиотеку.

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