сериализация и десериализация объектов из разных мест

1

У меня есть две отдельные программы, которым необходимо обмениваться информацией. Это совместное использование будет выполнено одним приложением, помещающим XML serialized объект в базу данных, а другое приложение будет загружать его на другую машину. Объекты имеют одни и те же variables но properties и methods разные.

  • Насколько точны классы для соответствия между двумя программами?
  • Является ли строка совпадений строкой или просто именами переменных, свойств и методов?

В результате я использовал библиотеку Newtonsoft.Json вместо xml и использовал <JsonObject(MemberSerialization.OptIn)> и JsonProperty() для управления сериализацией.

Теги:
serialization

3 ответа

3
Лучший ответ

Вы не указали, какой тип сериализации вы использовали.

Стандартный бинарный сериализатор NET не подходит для обмена данными между двумя различными сборками. Когда вы перейдете к десериализации, вы получите сообщение об ошибке, аналогичное [Culture].[Assembly].[Version].SourceClass нельзя десериализовать в [Culture].[Assembly].[Version].DestClass. Это произойдет, даже если классы идентичны.

Существует несколько способов обойти это. A) Используйте одну и ту же служебную DLL с обеих сторон для выполнения сериализации B) обманите ее в десериализацию с помощью переопределения, чтобы сообщить соответствующий класс Culture-Assembly-Version-Class, но это кажется изворотливым или C) использовать сериализацию XML, но это делает для очень многословного вывода, который также читается.

Для двоичной сериализации, а не бинарного форматирования NET, есть ProtoBuf-NET, которая быстрее, производит намного меньший результат и использует почти идентичный синтаксис.

How exact do the classes have to match between the two programs

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

  • 0
    Из-за среды развертывания сторонние решения являются исключительно последним средством. Я добавил вид сериализации в вопрос.
  • 0
    @Wayne одно приложение отправляет сериализованную информацию в другое место для использования, или это тот же общий ресурс компьютера, что и файл?
Показать ещё 2 комментария
1

Сериализация хранит только данные для переменных-объектов, свойств и т.д. Пока типы данных совместимы, они должны работать. Для функций вам не требуется строка за строкой.

  • 0
    @ ScottChamberlain Вы правы .. Позвольте мне отредактировать эту часть. Спасибо!
1

Все зависит от используемого вами сериализатора. Некоторые требуют идеального соответствия, другие, как правило, более слабо связаны с объектами.

Насколько точны классы для соответствия между двумя программами?

Ну, совсем нет. Но они должны быть похожими, потому что в противном случае сериализация не имеет смысла.

Является ли строка совпадений строками, именами переменных и методов?

Как указано выше: должно быть некоторое перекрытие. Обычно имена свойств должны быть одинаковыми. Но, конечно, вы также можете предоставить настраиваемое сопоставление.

Взгляните на библиотеку Newtonsoft, вы можете использовать ее (для json) следующим образом:

JsonConvert.DeserializeObject<IEnumerable<Unit>>(result);

Он не зависит от метода объекта, который сериализовал строку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню