Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: leoraОтветов: 3

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

От:

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

To

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

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

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

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

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

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

refactoringserialization

Ответы

Ответ 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. Это добавляет несколько сложностей.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы