Могу ли я сериализовать объект (содержащий элементы: словарь, список и т. д.) в Mono и десериализовать его в MS.NET или наоборот с помощью protobuf-net?

У меня есть сервер, работающий на MS.NET, и клиент на Mono (это движок Unity3D), и когда я пытаюсь выполнить BinaryFormatter(). Десериализовать такой объект:

   [Serializable]   
    public class Simulator  
    {
        public IDictionary<int, Task> tasks = new Dictionary<int, Task>(); 

клиентская сторона не может найти/загрузить типы: Dictionary, List... Тот же «клиентский код», работающий под MS.NET, работает хорошо, т.е. не имеет исключений при десериализации.

Как я прочитал из http://www.mono-project.com/FAQ:_Technical#Compatibility это распространенная проблема:

"Если вы сериализуете свои собственные классы, проблем нет, так как вы контролируете сборки и классы, используемые для сериализации. Однако, если вы сериализуете объекты из фреймворка, совместимость сериализации не гарантируется, так как внутренняя структура этих объектов может отличаться. Эта совместимость не гарантируется даже между разными версиями MS.NET или версиями Mono."

Помогает ли ProtoBuf-Net избежать/решить эту проблему сериализации/десериализации?


person Lonely Hunter    schedule 19.09.2012    source источник


Ответы (1)


Да, внешний инструмент сериализации, такой как protobuf-net, решит эту проблему — действительно, когда сериализация работает между платформами (с C++ на java, на python и на .net), версии фреймворка не так важны.

Так что да: данные, сериализованные в protobuf-net на моно/единстве, полностью совместимы при загрузке на .NET. Однако следует отметить, что BinaryFormatter и protobuf-net не являются прямыми эквивалентами 1:1 — каждый из них имеет несколько разные функции и поведение. Например, protobuf-net не ходит по событиям/делегатам и обычно плохо работает с вещами, известными только как «объект». Однако ключевые/общие сценарии, такие как словарь и список, полностью поддерживаются.

person Marc Gravell    schedule 20.09.2012