DataContractSerializer.Сериализация класса через интерфейс - PullRequest
1 голос
/ 11 марта 2012

У меня есть класс, который реализует некоторый интерфейс:

[DataContract]
public class ScriptState : IScriptState
{
   <...>
}

У меня есть простой класс помощника

public class Serializer
{
  string Serialize<T>(T obj)
  {
     MemoryStream ms = new MemoryStream();
     DataContractSerializer ser = new DataContractSerializer(typeof(T));
     ser.WriteObject(ms, obj);
     <...>
  }
}

проблема в том, что у меня слабосвязанное приложение, и я получаю объект ScriptState что-то вроде этого:

IScriptstate ss = ServiceLocator.Resolve<IScriptState>();

т.е. переменная имеет тип интерфейса, и она обрабатывается сериализатором:

Serializer.Serialize(ss);

и из-за этого DataContracrSerializer создается с типом интерфейса IScriptState, но реальным типом объекта является ScriptState, что приводит к ошибке, такого типа ScriptState не ожидается.

Стандартный обходной путь должен добавлять Knowntype ScriptState к интерфейсу IScriptState, но я не могу сделать это, очевидно:

[KnownType(typeof(Scriptstate))]
IScriptState
{}

потому что сборка с интерфейсом не имеет ссылки на сборку с классом.

Есть ли другое решение ??

1 Ответ

2 голосов
/ 12 марта 2012

Я думаю, что нашел решение. В классе помощника используйте obj.GetType() вместо typeof(T): DataContractSerializer ser = new DataContractSerializer(obj.GetType());

...