Двоичная сериализация .NET условно без ISerializable - PullRequest
1 голос
/ 07 января 2011

Я получил 2 класса, например:

public class A
{
    private B b;
    ...
}

public class B
{
    ...
}

Мне нужно сериализовать объект A с помощью BinaryFormatter. При удаленном взаимодействии оно должно включать поле b, но не при сериализации в файл. Вот что я добавил:

[Serializable]
public class A : MarshalByRefObject
{
        private B b;

        [OnSerializing]
        private void OnSerializing(StreamingContext context)
        {
            if (context.State == StreamingContextStates.File)
            {
                this.b = null;        
            }
        }
    ...
}

[Serializable]
public class B : MarshalByRefObject
{
    ...
}

Я думаю, что это плохой дизайн, потому что если другой класс C также содержит B, в классе C мы должны добавить дублирующую логику OnSerializing (), как в A. Класс B должен решать, что делать, а не класс A или C.

Я не хочу использовать интерфейс ISerializable, потому что в SerializationInfo нужно добавить слишком много переменных в классе B.

Я могу создать SerializationSurrogate для класса B, который ничего не выполняет в GetObjectData () и SetObjectData (), а затем использовать его при сериализации в файл. Однако та же проблема обслуживания, потому что тот, кто изменяет класс B, не может заметить, что произойдет во время сериализации и существования SerializationSurrogate.

Есть ли лучшая альтернатива?

Ответы [ 2 ]

0 голосов
/ 09 января 2011

Хорошо, у меня неправильное представление о MarshalByRefObject.Он не сериализуется, поэтому я могу использовать [NonSerializable] для сериализации файлов.

Тем не менее, у меня есть некоторые классы, помеченные [Serializable] для маршалинга по значению при удаленном взаимодействии.Поэтому необходимо отличать его от сериализации файлов:

[Serializable]  
public class A 
{          
    private B b;      

    [OnSerializing]          
    private void OnSerializing(StreamingContext context)          
    {              
        if (context.State == StreamingContextStates.File)              
        {                  
            this.b = null;                      
        }          
    }      
    ...  
}    

[Serializable]  
public class B 
{      
    ...
 }

[NonSerialized] не помогает в этом случае, потому что:
1) Необходимо сериализовать поле b при удаленном взаимодействии, но не на диск.2) Если классы C, D, E и т. Д. Также имеют поле b, необходимо обновить все из них с помощью [NonSerialized].Слишком много задач по обслуживанию.

Есть ли лучшая альтернатива?

0 голосов
/ 07 января 2011

Настоящая проблема здесь заключается в использовании Serializable (т.е. попытка сериализации) производного типа MarshalByRefObject, который практически невозможен, если объект находится в другом домене.

Используйте один или другойно не оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...