В чем разница между использованием атрибута Serializable и реализацией ISerializable?


в чем разница между использованием Serializable атрибут и реализация ISerializable интерфейс?

5 72

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
}

ISerialize заставить вас реализовать логику сериализации manially, в то время как маркировка Сериализуемым атрибутом (вы это имели в виду?) расскажет двоичный сериализатор, что этот класс может быть сериализован. Он будет делать это автоматически.

наследование от ISerializable позволяет вам выполнить пользовательскую реализацию (de)сериализации. При использовании только Сериализуемого атрибута сериализация (de) может управляться только атрибутами и является менее гибкой.