Ситуация следующая: Есть класс сообщения, которое посылается или принимается сервером в теле Http-запроса:
[DataContract(Namespace = "")]
public class MyMessage
{
private JsonHead m_Head;
[DataMember(Name = "Head")]
public JsonHead Head
{
get { return m_Head; }
set { m_Head = value; }
}
}
В голову Head надо сувать различные дочерние классы в зависимости от ситуации. Вот абстрактный класс:
[DataContract(Namespace = "")]
[Serializable]
public abstract class JsonHead: ISerializable
{
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{}
}
Вот, к примеру, его наследник:
[DataContract(Name = "HashHead", Namespace = "")]
[Serializable]
public class HashHead : JsonHead
{
private string m_RegId;
private string m_Hash;
[DataMember(Name = "RegistryId")]
public string RegistryId
{
get { return m_RegId; }
set { m_RegId = value; }
}
[DataMember(Name = "Hash")]
public string Hash
{
get { return m_Hash; }
set { m_Hash = value; }
}
public HashHead(string par1, string par2)
{
m_Hash = par1;
m_RegId = par3;
}
public override void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.SetType(this.GetType());
}
}
Метод на сервере, подстовляем в Head экземпляр класса HashHead вместо JsonHead :
[OperationContract]
[WebGet(UriTemplate = "Head1", ResponseFormat = WebMessageFormat.Json)]
MyMessage GetJsonHead1()
{
JsonMessage result = new JsonMessage();
result.Head = new HashHead("test","test");
return result;
}
В итоге возникает ошибка сериализации... Что я сделал не так, и возможно-ли реализовать мою задумку? По идее должен вызываться метод HashHead'а при сериализации и все должно быть гладко.
А вот это мысль. В зависимости от метода, будет сериализация к нужному типу. Как раз то, что надо! Спасибо!