Laden...

ISerializable verwendende Objekte nicht-binär serialisieren

Erstellt von TBR vor 13 Jahren Letzter Beitrag vor 13 Jahren 876 Views
T
TBR Themenstarter:in
154 Beiträge seit 2009
vor 13 Jahren
ISerializable verwendende Objekte nicht-binär serialisieren

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

2.760 Beiträge seit 2006
vor 13 Jahren

Schau dir mal IXmlSerializable an.