У меня есть класс, который я сериализовал на диск на машинах локальных пользователей. Мне нужно реорганизовать этот класс, и я изменил все объекты (все, кроме перечислений, строк, чисел) на интерфейсы. Внизу все тот же бетонный класс. Меня беспокоит нарушение настойчивости существующих пользователей
От:
public class Foo
{
public double Count;
public State MyState;
}
To
public class IFoo
{
public double Count;
public IState MyState;
}
но теперь я получаю ошибки из кода сериализации, в котором говорится: "Невозможно сериализовать, потому что это интерфейс"
ошибка гласит:
"Произошла ошибка при отображении типа" Foo "." "Невозможно сериализовать член 'Foo.My' типа 'IState', подробности см. Во внутреннем исключении".
как лучше всего обойти это?
Ответ 1 · рейтинг 2 · Chad Grant
Вы не можете сериализовать интерфейсы, потому что количество типов, которые могут реализовать интерфейс, бесконечно, и сериализатор не знает, какой это конкретный тип.
class A : IFoo {}
class B : IFoo {}
class C : IFoo {}
//snip//
IFoo f = new A();
f = new B();
f = new C();
Вы должны указать, если вы сериализуете A, B или C.
Другой способ подумать об этом - при десериализации в IFoo, как вы узнаете, что создать ... A, B или C ... и т. Д.?
Ответ 2 · Mehmet Aras
Я думаю, вам придется явно обрабатывать сериализацию, реализуя ISerializable. Подумайте, как десериализация может определить, какой конкретный класс использовать для IState. Не знает. Вот почему вам нужно будет обрабатывать сериализацию самостоятельно.
Ответ 3 · Community
Подумайте о том, чтобы ваш IState интерфейс унаследовал от ISerializable:
public interface IState : ISerializable
Сначала прочтите ISerializable. Это добавляет несколько сложностей.