Я получил 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.
Есть ли лучшая альтернатива?