Рефакторинг класса для интерфейса без нарушения сериализации в C #

У меня есть класс, который я сериализовал на диск на машинах локальных пользователей. Мне нужно реорганизовать этот класс, и я изменил все объекты (все, кроме перечислений, строк, чисел) на интерфейсы. Внизу все тот же бетонный класс. Меня беспокоит нарушение настойчивости существующих пользователей

От:

public class Foo
{
     public double Count;
     public State MyState;
}

To

public class IFoo
{
     public double Count;
     public IState MyState;
}

но теперь я получаю ошибки из кода сериализации, в котором говорится: «Невозможно сериализовать, потому что это интерфейс»

ошибка гласит:

"Произошла ошибка при отображении типа" Foo "." «Невозможно сериализовать член 'Foo.My' типа 'IState', подробности см. Во внутреннем исключении».

как лучше всего обойти это?


person leora    schedule 01.05.2009    source источник
comment
Собирался сказать ... из-за соглашений об именах должен быть C #. Теперь это помечено :(   -  person CurtainDog    schedule 01.05.2009


Ответы (3)


Вы не можете сериализовать интерфейсы, потому что количество типов, которые могут реализовать интерфейс, бесконечно, и сериализатор не знает, какой это конкретный тип.

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 ... и т. Д.?

person Chad Grant    schedule 01.05.2009
comment
Девиант правильный. Интерфейс - это контракт ... ваш объект, реализующий этот интерфейс ... соглашается с этим контрактом. Вы сериализуете свой объект, а не контракт. - person datacop; 01.05.2009

Я думаю, вам придется явно обрабатывать сериализацию, реализуя ISerializable. Подумайте, как десериализация может определить, какой конкретный класс использовать для IState. Не знает. Вот почему вам нужно будет обрабатывать сериализацию самостоятельно.

person Mehmet Aras    schedule 01.05.2009

Подумайте о том, чтобы ваш IState интерфейс унаследовал от ISerializable:

public interface IState : ISerializable

Сначала прочтите ISerializable. Это добавляет несколько сложностей.

person Community    schedule 01.05.2009