verwendetes Datenbanksystem: XML
Hallo, kurz und knapp:
Gibt es eine Möglichkeit, Sachen, welche "ISerializable" implementieren, damit sie überhaupt serialisierbar sind, nicht binär zu serialisieren?
Es gibt ja irgendwie nur BinaryFormatter und SoapFormatter...
Binär kann ichs nicht brauchen, weils manuell editierbar sein muss.
Problem ist, ich hab eine Klasse mit mehrdimensionalen Arrays. Der XmlSerializer will diese Klasse serialisieren und wird deswegen eine Exception.
Die "GetObjectData"-Methode von ISerializable ignoriert der irgendwie - oder mach ich was falsch?
Die Implementation:
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
List<LayeredMapSerialization>[] convertedElements = new List<LayeredMapSerialization>[LayersCount];
for (int layer = 0; layer < LayersCount; layer++)
{
for (int x = 0; x < _width; x++)
{
for (int y = 0;y<_height;y++)
{
convertedElements[layer].Add(new LayeredMapSerialization
{
Element = _items[layer][x, y],
X = x,
Y = y
});
}
}
}
info.AddValue("elements", convertedElements);
info.AddValue("elementInfo", new LayeredMapSerializationInfo
{
Layers = LayersCount,
Width = _width,
Height = _height
});
}
[Serializable]
private struct LayeredMapSerialization
{
public int X { get; set; }
public int Y { get; set; }
public T Element { get; set; }
}
[Serializable]
private struct LayeredMapSerializationInfo
{
public int Layers { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
Serialisierungs-Funktion:
public static void Serialize<T>(object data, string path)
{
try
{
var sw = new System.IO.StringWriter();
var sr = new XmlSerializer(typeof(T));
sr.Serialize(sw, data);
System.IO.File.WriteAllText(path, sw.ToString());
}
catch (Exception ex)
{
MessageBox.Show(ex.Message + ex.StackTrace);
while (ex.InnerException != null)
{
ex = ex.InnerException;
MessageBox.Show(ex.Message + ex.StackTrace);
}
}
}
Der Aufruf:
XMLSerializer.Serialize<LayeredMapList<Element>>(gamelevel, "levelMap.xml");
Danke euch 😃
TBR
Schau dir mal IXmlSerializable an.