Я использую сериализатор JSON WCF для создания JSON для использования в качестве возвращаемых данных для платформы ASP.NET MVC. Я делаю это потому, что встроенный JsonAction не предоставляет никакого способа управления именованием открытых свойств в сериализованном JSON.
public override void ExecuteResult(ControllerContext context)
{
...
if (Data != null)
{
var serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(Data.GetType());
System.IO.MemoryStream ms = new System.IO.MemoryStream();
serializer.WriteObject(ms, this.Data);
response.Write(Encoding.Default.GetString(ms.ToArray()));
}
}
В этом примере я использую это с OpenFlashChart, поэтому я установил this.Data для экземпляра PieChart. Работало нормально. Затем я установил this.Data для экземпляра Chart и получил следующее исключение:
Type 'OpenFlashChart.Pie' with data contract name 'Pie:http://schemas.datacontract.org/2004/07/OpenFlashChart' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
Очевидно, что когда я дал сериализатору элемент PieChart
, он мог заключить, что мне также нужен класс Pie. Почему, когда я предоставляю Chart<PieChart>
, он больше не смотрит на классы, используемые PieChart
? Есть ли способ обойти эту проблему без необходимости аннотировать все с помощью KnownTypeAttributes
?