Ненадежная стратегия десериализации - PullRequest
5 голосов
/ 06 декабря 2010

У меня довольно сложная сеть объектов, которую я хотел бы сериализовать и десериализовать в ненадежной среде (веб-браузер, использующий Unity 3D).Обычная BinaryFormatter сериализация работает нормально, но десериализация завершается с ошибками «доступа к частному полю».Он отлично работает, когда я работаю локально.

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

ОБНОВЛЕНИЕ Я не хочу, чтобы сериализация не имела доступа к моим личным данным, я хочу разрешить сериализацию для доступа к моим личным данным без необходимости их обнародования, ставя под угрозу инкапсуляцию моего кода.

Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 декабря 2010

Сериализаторы типа XmlSerializer и JavaScriptSerializer работают против публичных участников, поэтому они должны (пересекает пальцы) работать приемлемо с точки зрения доверия.Вы также можете попробовать protobuf-net, если вам нужен двоичный файл, но я не проводил агрессивного тестирования этого сценария (хотя он работает в таких вещах, как Silverlight, который имеет довольно требовательную модель доверия).придерживайтесь BinaryFormatter, но не хотите, чтобы оно касалось ваших полей напрямую, вы могли бы реализовать ISerializable, но делать все это вручную ... больно.

1 голос
/ 07 декабря 2010

Ни один из ответов действительно не ответил на мой вопрос (см. Обновление для уточнения).В итоге я написал свой собственный простой формат сериализации, используя BinaryWriter.В конце я понял, что то, что я сделал, было эквивалентно ручной реализации интерфейса ISerializable для моих классов.Мне пришлось вручную реализовать граф сериализации в коде.Хотя это и не сложно, это немного неуловимо, и это уже сделано для меня.Для будущих людей с этим вопросом, если нет лучших ответов, я рекомендую вручную ввести ISerialzable.

0 голосов
/ 06 декабря 2010

Что ж, если вы хотите запретить доступ к частным полям посредством сериализации, вы можете перейти к сериализации Xml, возможно, даже сериализации Json.

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

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