Сериализация / десериализация между MONO-клиентом и сервером ASP.NET - возможно или нет?

У меня есть различные объекты, которые я хотел бы иметь возможность загружать и сохранять на ASP.NET (веб-сервер IIS) из моего клиента MONO. Поэтому я сделал их объектами класса.

В качестве примера у меня есть [Score], который я буду использовать для создания его истории на сервере.

Score.cs

using System.Runtime.Serialization;
[System.Serializable]
public class Score
{
    public long Total;
    public string Name;
    public Score(){}
    public Score(string name, long total)
    {
        Total = total;
        Name = name;
    }

}

Этот код я хочу использовать в качестве структуры данных (n-уровневая архитектура) как в MONO, так и в качестве клиентской структуры, а на моем сервере ASP.NET я также использую его как объект на стороне сервера.

Что я делаю, так это то, что хочу создать массив списков, например так:

List<Score> hiscores = new List<Score>();
hiscores.add (new Score("Player 1", 10000));
hiscores.add (new Score("Player 2", 20000));
hiscores.add (new Score("Player 3", 30000));
hiscores.add (new Score("Player 4", 40000));

... тогда я хочу сериализовать его в байтовый массив, чтобы я мог POST его как двоичный файл:

MemoryStream membytes = new MemoryStream(); 
BinaryFormatter binFormatter = new BinaryFormatter();
binFormatter.Serialize(membytes, hiscores );

...

НО - на веб-сервере в ASP.NET/C# я получаю ошибку 500, сообщающую, что он не может загрузить сборку для десериализации данных???

Да?! Я читал кого-то, предлагающего сделать сборку как внешнюю? и затем связать его на обеих платформах, это возможно в моей ситуации, или я как-то не на том пути?

Я могу легко перенести simle bytearray со значениями от 0x00 до 0xff в мой ASP.NET и сохранить его. Но как только я начну использовать сериализацию / десериализацию в своих объектах List и перенести их в Byte[], что-то не так?

ВОПРОС Возможна ли десериализация, если сериализатор не сделан на той же платформе?

Можно ли поместить объекты данных (бизнес-объекты) в проект DLL, а затем связать / использовать это на обеих платформах и таким образом получить одинаковое значение сборки?

4 ответа

BinaryFormatter создает не совместимый двоичный формат. Используйте его, только если и клиент, и сервер запускают одну и ту же версию CLR. В противном случае вы можете использовать совместимый формат, такой как XML (XmlSerializer) или JSON (JavaScriptSerializer) общаться между вашим клиентом и сервером.

Ваша большая ошибка заключается в использовании BinaryFormatter за это. Это имеет много проблем.

  1. Вы должны доверять данным, которые вы десериализуете. Это редко имеет место в клиент-серверных приложениях.
  2. Он использует какой-то внутренний формат, и я не уверен, насколько это совместимо между различными версиями.net или даже между.net и mono. Используйте сериализатор с четко определенным форматом.

Хорошей альтернативой для этого варианта использования являются сериализаторы Json или Xml. Лично я обычно использую Json.net, но.net также имеет встроенный сериализатор Json.

BinaryFormatter может быть правильным выбором, если вы сериализуете сложный граф объектов, не нуждаетесь в управлении версиями и только читаете его обратно в той же системе, чтобы вы могли доверять данным. И даже в этом сценарии я бы использовал его только потому, что не знаю лучшей альтернативы, а не потому, что мне нравится BinaryFormatter,


Так как вы заявили, что передаете много данных, я загляну в protobuf-net. Это двоичный сериализатор, который очень быстр и производит компактные данные. Но вы должны аннотировать все ваши свойства с цифровыми идентификаторами. Его автор Марк Грэвелл активен здесь на SO, так что вы можете рассчитывать на хорошую поддержку.

Публикация своего собственного ответа, так как мне действительно удалось заставить его работать без дополнительных затрат.

Прежде всего, спасибо за все замечательные предложения для дополнительных библиотек, но мой первый вопрос был о том, можно ли заставить MONO и ASP.NET взаимодействовать через сериализацию.

Ответ: ДА!

Все, что мне нужно было сделать, это создать отдельный проект класса (DLL), в который я поместил все структуры данных, необходимые для сериализации.

Затем сделайте ссылку на обе платформы и вуаля, одна и та же DLL = одна и та же сборка, и обе платформы согласятся, что сериализация и десериализация не проблема.

Обратите внимание на двоичный результат / трафик / пространство

Я согласен, двоичные данные кажутся немного "излишними" по сравнению с некоторыми другими предлагаемыми плагинами / библиотеками здесь. Но это возможно без каких-либо дополнительных библиотек.

Это была моя первоначальная цель.

Я использовал Silverlight Serializer Майка Тэлбота http://whydoidoit.com/2010/04/08/silverlight-serialization/ который очень легкий и должен работать как с MONO, так и с.NET

Другие вопросы по тегам