Serialisierung - welche Strategie



  • Hallo Experten,

    ich habe einige verwandte Objekte in einer Collection.

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    
    namespace Test_Xml
    {
        public class MyFantasticBaseClass
        {
            private int _id = 0;
    
            public MyFantasticBaseClass(int id)
            {
                this._id = id;
            }
    
            public int Id
            {
                get { return (_id); }
            }
        }
    
        public class FirstDerivedClass : MyFantasticBaseClass
        {
            private bool _isReallyUseful = true;
    
            public bool IsReallyUseful
            {
                get { return (_isReallyUseful); }
                set { _isReallyUseful = value; }
            }
        }
    
        public class SecondDerivedClass : MyFantasticBaseClass
        {
            private double _zoom = 1.0;
            private MyFantasticBaseClass _linkedElement = null;
    
            public double Zoom
            {
                get { return (_zoom); }
                set { _zoom = value; }
            }
    
            public MyFantasticBaseClass LinkedElement
            {
                get { return (_linkedElement); }
                set { _linkedElement = value; }
            }
        }
    
        public class MyFineCollection:ICollection<MyFantasticBaseClass>
        {
            List<MyFantasticBaseClass> _innerList = new List<MyFantasticBaseClass>();
    
            // ICollection implementation details
        }
    }
    

    Die möchte ich speichern und später wieder laden. Der lesbarkeit der Dateien halber soll das in XML-Dateien geschehen.

    Ich habe bereits früher Daten als XML gespeichert, allerdings waren die nie in einer Vererbungshierarchie gekapselt. Für diese bloße Sammlung von int- und double-Werten tat es folgender Code innerhalb des DataStorageObject:

    // Save data to xml file
                using (System.IO.StreamWriter saveStream = new System.IO.StreamWriter(filename))
                {
                    if (!System.IO.File.Exists(filename))
                        System.IO.File.Create(filename);
                    System.Xml.Serialization.XmlSerializer saveSerializer = new System.Xml.Serialization.XmlSerializer(typeof(DataStorageObject));
                    saveSerializer.Serialize(saveStream, this);
                    saveStream.Close();
                }
    

    Das funktionierte ganz ohne XSD oder DTD.

    War das pures Glück oder kann ich getrost weiterhin auf Schemadefinitionen verzichten?

    In
    http://msdn.microsoft.com/de-de/library/ty01x675
    las ich, dass in .NET zwei Möglichkeiten der Serialisierung vorgesehen sind.
    Hat jemand Erfahrungen damit, ob es besser ist, in jedem abgeleiteten Objekt vier Methoden mit jeweils einem der Attribute

    OnDeserializedAttribute,
    OnDeserializingAttribute,
    OnSerializedAttribute oder
    OnSerializingAttribute

    zu versehen oder lieber die Schnittstelle ISerializable inklusive der Methoden
    ctor(SerializationInfo info, StreamingContext context) und
    GetObjectData() zu implementieren?

    Mit freundlichem Gruß,

    luker



  • http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=236

    Wichtige Information für Serialisierung mit XML. Alle, aber auch alle deine Werte die du Serialisieren willst müssen, öffentliche Getter wie Setter haben.Es muss ein Standardmäßiger öffentlicher Ctor vorhanden sein.
    Aber Code oben sollte dir helfen.


Log in to reply