В чем разница между использованием атрибута Serializable и реализацией ISerializable?
в чем разница между использованием Serializable
атрибут и реализация ISerializable
интерфейс?
5 ответов:
при использовании
SerializableAttribute
атрибут вы помещаете атрибут в поле во время компиляции таким образом, что во время выполнения средства сериализации будут знать, что сериализовать на основе атрибутов, выполнив отражение типа class/module/assembly.[Serializable] public class MyFoo { … }
выше указано, что средство сериализации должно сериализовать весь класс
MyFoo
, тогда как:public class MyFoo { private int bar; [Serializable] public int WhatBar { get { return this.bar; } } }
используя атрибут вы можете выборочно выберите, какие поля должны быть сериализованы.
при использовании
ISerializable
интерфейс, сериализация эффективно переопределяется пользовательской версией, переопределяяGetObjectData
и(и предоставив конструктор формыSetObjectData
MyFoo(SerializationInfo info, StreamingContext context)
), была бы более тонкая степень контроля над сериализацией данных.см. также этот пример пользовательской сериализации здесь StackOverflow. Он показывает, как поддерживать обратную совместимость сериализации с различными версиями сериализованных данных.
надеюсь, что это помогает.
The SerializableAttribute указывает платформе выполнить процесс сериализации по умолчанию. Если вам нужно больше контроля, вы можете использовать тег интерфейс ISerializable интерфейс. Затем вы поместили бы свой собственный код для сериализации объекта в
GetObjectData
метод и обновитьSerializationInfo
объект, который передается в его.
The
ISerializable
интерфейс позволяет реализовать пользовательские сериализации другое, чем по умолчанию. Когда вы реализуетеISerializable
интерфейс, вы должны переопределитьGetObjectData
метод следующим образомpublic void GetObjectData (SerializationInfo serInfo, StreamingContext streamContext) { // Implement custom Serialization }