Json deserialize af abstract klasse
Jeg anvender Json til at serialisere nogle objecter, af hensyn til memory forbrug.Json : http://json.codeplex.com/
Mit problem er at jeg kan ikke få Json til at serialisere mine abstracte objekter ordentligt.
Jeg bruger følgende kode til at gemme og loade mine objekter:
public void SaveToDisk(string sFile)
{
using (var file = File.OpenWrite(sFile))
{
var serializer = new JsonSerializer();
//TextWriter tw = new StreamWriter(file);
var writer = new BsonWriter(file);
serializer.Serialize(writer , this);
}
}
public static PdfGraph LoadFromDisk(string sFile)
{
PdfGraph graph;
using (var file = File.OpenRead(sFile))
{
var serializer = new JsonSerializer();
var reader = new BsonReader(file);
graph = serializer.Deserialize<PdfGraph>(reader);
}
return graph;
}
Dette virker okay for alt andet end et abstract objekt som ligger et par lag nede i PdfGraph.
public abstract class numberFormatter
public class defaultNumberFormatter : numberFormatter
public class dateTimeNumberFormatter : numberFormatter
Problemet er denne linje (taget fra et subobjekt i PdfGraph):
public numberFormatter xNumberFormat = new defaultNumberFormatter();
I den instans af PdfGraph jeg gemmer er xNumberFormat af typen dateTimeNumberFormatter, men når jeg deserialisere mit gemte objekt får jeg et PdfGraph objekt hvor xNumberFormat er af typen defaultNumberFormatter.
Jeg har læst på Jsons hjemmeside at man skal anvende TypeNameHandling til denne slags problem.
Således:
public void SaveToDisk(string sFile)
{
using (var file = File.OpenWrite(sFile))
{
var serializer = new JsonSerializer{TypeNameHandling = TypeNameHandling.All};
//TextWriter tw = new StreamWriter(file);
var writer = new BsonWriter(file);
serializer.Serialize(writer, this);
}
}
public static PdfGraph LoadFromDisk(string sFile)
{
PdfGraph graph;
using (var file = File.OpenRead(sFile))
{
var serializer = new JsonSerializer {TypeNameHandling = TypeNameHandling.All};
var reader = new BsonReader(file);
graph = serializer.Deserialize<PdfGraph>(reader);
}
return graph;
}
Typen a xNumberFormat bliver så også godt nok skrevet ned i mine serialiserede objekter:
"xNumberFormat":"$type":"Code.Ctrls.GraphPainter+dateTimeNumberFormatter, CodeCtrls.Net","sAxisTitle":null}
Men når jeg prøver at deserialisere dette objekt får jeg følgende fejl:
Error = {"Error setting value to 'sAxisTitle' on 'Code.Ctrls.GraphPainter+defaultNumberFormatter'."}
InnerException = {"Unable to cast object of type 'defaultNumberFormatter' to type 'dateTimeNumberFormatter'."}
Hvad skal jeg gøre for at få fremtryllet et objekt af typen dateTimeNumberFormatter?
Kan jeg hjælpe den mere på vej somehow or?
Undskyld den lange beskrivelse... Håber jeg fik gjort mig bare en smule forståelig.
Melsvik