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