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

У меня есть различные объекты, которые я хотел бы иметь возможность загружать и сохранять на 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));

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

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

...

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 25 июля 2011

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

1 голос
/ 26 июля 2011

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

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

Ответ: ДА!

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

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

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

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

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

1 голос
/ 25 июля 2011

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

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

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

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


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

0 голосов
/ 25 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...