Как я могу десериализовать интерфейсный тип?

Я связался с их службой поддержки, и они объяснили, что, по крайней мере, в моем регионе они прибавили 3,5% к обменному курсу XE.com. Я смог передать это моему бухгалтеру и использовать в качестве доказательства не облагаемых налогом расходов на ведение бизнеса.

5
задан dr. evil 20 October 2009 в 09:43
поделиться

4 ответа

Имеет смысл получить эту ошибку, потому что свойство IModel может относиться к разным классам, и нет гарантии, что все они являются сериализуемыми.


Хорошо, я попробовал, и мы получили:

Ошибка тестового примера, он работает на моем компьютере.


interface IFoo { }

[Serializable]
class CFoo : IFoo   { }

[Serializable]
class Bar
{
    public IFoo Foo { get; set; }
}

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

Bar b = new Bar();
b.Foo = new CFoo();

using (var s = new System.IO.MemoryStream())
{
    var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
    bf.Serialize(s, b);
    s.Position = 0;
    b = (Bar)bf.Deserialize(s);

    Console.WriteLine("OK");
}

Итак, чем отличается ваша IModel и Model ?

5
ответ дан 14 December 2019 в 04:42
поделиться

Я подозреваю, что это потому, что во время десериализации он инициирует новый экземпляр класса, а затем копирует в него данные. Он не может создать новый интерфейс, поэтому десериализация не может быть завершена. Вот почему вам нужен конструктор, который не принимает аргументов для сериализации.

Не уверен в решении, я никогда не работал над этим. Я бы, вероятно, переопределил класс и унаследовал свойство с конкретным типом, а затем сериализовал бы его.

3
ответ дан 14 December 2019 в 04:42
поделиться

Возможно, вам нужно неявно раскрыть это свойство внутри вашего класса:

вместо Свойство IModel.Model add

public MyClass Model
0
ответ дан 14 December 2019 в 04:42
поделиться

I Я почти уверен, что вы не можете сериализовать / десериализовать интерфейсы, только экземпляры классов. Я не могу найти никакой документации, подтверждающей это, но помню, как безуспешно пытался сделать то же самое.

0
ответ дан 14 December 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: