В чем разница между использованием атрибута Serializable и реализацией ISerializable?
в чем разница между использованием Serializable
атрибут и реализация ISerializable
интерфейс?
5 ответов
при использовании SerializableAttribute
атрибут вы помещаете атрибут в поле во время компиляции таким образом, чтобы во время выполнения средства сериализации знали, что сериализовать на основе атрибутов, выполнив отражение на типе класса/модуля/сборки.
[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. Он показывает, как поддерживать обратную совместимость сериализации с различными версиями сериализованных данных.
надеюсь, что это помогает.
на SerializableAttribute указывает платформе выполнить процесс сериализации по умолчанию. Если вам нужно больше контроля, вы можете использовать тег интерфейс ISerializable интерфейс. Затем вы поместите свой собственный код для сериализации объекта в GetObjectData
метод и обновить SerializationInfo
объект, который передается ему.
на ISerializable
интерфейс позволяет реализовать пользовательские сериализации кроме значения по умолчанию.
Когда вы реализуете ISerializable
интерфейс, вы должны переопределить GetObjectData
метод следующим образом
public void GetObjectData (SerializationInfo serInfo,
StreamingContext streamContext)
{
// Implement custom Serialization
}
ISerialize заставит вас реализовать логику сериализации manially, отмечая при этом атрибут Serializable (вы это имели в виду?) расскажет двоичный сериализатор, что этот класс может быть сериализован. Он сделает это автоматически.
наследование от ISerializable позволяет пользовательской реализации сериализации (de). При использовании только атрибута Serializable сериализация (de) может управляться только атрибутами и является менее гибкой.