Разработан ли дизайн интерфейсов маркеров, таких как Java Serializable или Cloneable, в C #? - PullRequest
2 голосов
/ 11 июня 2011

Java предоставляет java.io.Serializable и java.lang.Cloneable в своей стандартной библиотеке (и специальную поддержку для него на языке и JVM) для задач по десериализации / сериализации / клонированию.

Выбрал ли C # другой путьчтобы обеспечить эту функциональность, чем реализация и код, использующий ее, отличаются от Java и почему это было сделано таким образом?

В качестве примера, почему C # использует и атрибут (аннотацию), и интерфейс для сериализации?

Ответы [ 5 ]

3 голосов
/ 11 июня 2011

.NET не использует ISerializable только как интерфейс маркера. Он действует не только как маркер, но также позволяет вам точно контролировать, как .NET будет сериализовать класс, реализуя GetObjectData и конструктор, который принимает подходящие аргументы.

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

Итак: используйте ISerializable, когда вы хотите определить собственное поведение сериализации; или используйте атрибут [Serializable], если хотите оставить его до средства форматирования сериализации.

Я бы назвал это эволюцией? Я не знаю. .NET просто предлагает вам разные степени гибкости.

2 голосов
/ 12 июня 2011

Я не думаю, что C # эволюционировал. Скорее они исправили обе вещи:

  • Сериализация в Java не очень чистая: десериализация включает в себя «создание» объекта без вызова конструктора, весь процесс может включать в себя среду выполнения, вызывающую частные методы и т. Д. отметьте характеристики , если вам интересно.

  • Cloneable просто сломан. Это не должен быть интерфейс маркера, но указывается метод clone(). Поскольку у вас есть Cloneable s, вы не можете clone().

В сущности, в Java есть много вещей, в основном из предшествующих 1.2 дней, которые совершенно испорчены / испорчены / нечисты / что угодно.

2 голосов
/ 11 июня 2011

, если вы хотите что-то о сериализации: отметьте это

1 голос
/ 12 июня 2011

Интерфейсы маркеров, вероятно, являются одним из худших решений, когда-либо реализованных в Java.Я имею в виду, просто посмотрите, насколько бесполезным оказался Cloneable, потому что никто не определил публичный метод clone () в интерфейсе.

.NET не идет в этом направлении (по крайней мере, я не знаю ни одного интерфейсав этом направлении) - это не столько эволюция, сколько отказ от всего понятия.Другим направлением, которое, кажется, все больше и больше используется, являются аннотации, которые, как я полагаю, вы могли бы видеть как «маркер», но на более базовом уровне (например, я вполне уверен, что если бы Java была реализована сегодня, переходный процесс был бы аннотациейне классификатор)

1 голос
/ 11 июня 2011

Не уверен, что вы подразумеваете под «развитым», если я что-то думаю, тенденция в сторону атрибутов, а не маркерных интерфейсов. Я не знаю, продвигался ли Java и в последнее время.

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

...