Сериализатор, который видит личные данные, имеет вывод для анализа, поддерживает общие коллекции и поддерживает настраиваемую сериализацию - PullRequest
0 голосов
/ 15 сентября 2010

Мне нужен очень специфический вид сериализатора .NET.

Мои требования:

  1. не должен пропускать личные данные
  2. вывод должен быть удобочитаемым (или, по крайней мере, легко разбираемым), предпочтительно XML
  3. должен поддерживать общие коллекции (нет необходимости быть легким, но это должно быть возможно)
  4. должен поддерживать пользовательскую сериализацию для определенных классов.

Мне нужно (2) для моей сложной схемы допуска версий и (4), потому что мне нужно реализовать оптимизированную сериализацию для огромного объекта (массива), который мне нужно сериализовать.

Ошибка XmlSerializer (1).
Сбой двоичного формата (2).
SoapFormatter не работает (3) и, по-видимому, устарел.
Сбой DataContractSerializer (4) AFAIK.
NetDataContractSerializer, похоже, не работает (2), потому что я прочитал, что он не «совместим» (хотя он использует XML ??)
Protobuf-net не работает (2).

Не могли бы вы порекомендовать использовать сериализатор?
Также: Как NetDataContractSerializer не совместим? Пожалуйста, дайте мне пример, где он нарушает совместимость.

Примечание: все эти сериализаторы так или иначе поддерживают допуск версии, но мне нужны более продвинутые функции допусков версии. См. мой вопрос , если вам интересно, почему.

Редактировать: Оказывается, что оба DataContractSerializer и NetDataContractSerializer поддерживают оба (2) и (4), поэтому мой вопрос решен.

1 Ответ

1 голос
/ 15 сентября 2010

Я не думаю, что вам нужен собственный сериализатор, я думаю, вам нужны собственные методы сериализации в ваших классах.

Например: если вы используете XmlSerializer, вы можете реализовать IXmlSerializable в своем классе данных и вручную реализовать методы, которые могут охватывать любую комбинацию версий, личных или общедоступных данных или что-либо еще. Точно так же ISerializable можно использовать для настройки поведения, если вы используете двоичную сериализацию.

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

public class FooList : List<Foo>, IXmlSerializable

Это позволяет настроить сериализацию полуграничного класса коллекции. Или, возможно, более многоразового использования:

public class CustomSerializableList<T> : List<T>, IXmlSerializable where T : IXmlSerializable

... который дает вам общий список, содержание которого гарантированно равно IXmlSerializable, что означает, что реализация IXmlSerializable для самого списка довольно проста.

...