Announcement

Collapse
No announcement yet.

Serialization funktioniert nicht

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Serialization funktioniert nicht

    Hallo zusammen,

    Ich bin grad am Verzweifeln. Ich habe eine Klasse die sieht so aus:

    [highlight=c#]
    [Serializable]
    public class FmeaIdentifier:ISerializable
    {
    private readonly String _partStart;
    private readonly List<String> _fmeaMatchingErrors;
    private readonly String _tcaIdentifier;

    public FmeaIdentifier(string partStart, List<string> fmeaMatchingErrors, string tcaIdentifier)
    {
    _partStart = partStart;
    _tcaIdentifier = tcaIdentifier;
    _fmeaMatchingErrors = fmeaMatchingErrors;
    }

    protected FmeaIdentifier(SerializationInfo info, StreamingContext context)
    {
    _partStart = info.GetString("PartStart");
    _fmeaMatchingErrors = (List<String>) info.GetValue("FmeaMatchingErrors", typeof (List<String>));
    _tcaIdentifier = info.GetString("TcaIdentifier");
    }

    protected FmeaIdentifier()
    {

    }

    public string TcaIdentifier { get { return _tcaIdentifier; } }
    public IList<string> FmeaMatchingErrors { get { return _fmeaMatchingErrors; } }

    public string PartStart { get { return _partStart; } }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
    info.AddValue("PartStart",_partStart);
    info.AddValue("TcaIdentifier",_tcaIdentifier);
    info.AddValue("FmeaMatchingErrors",_fmeaMatchingEr rors);
    }
    }
    [/highlight]

    Anlegen tue ich die Teile so:

    [highlight=c#]
    _identifiers = new List<FmeaIdentifier>();

    _identifiers.Add(new FmeaIdentifier("R", new List<string> { "open", "hello world" }, "open"));
    _identifiers.Add(new FmeaIdentifier("C", new List<string> { "open" }, "open"));
    [/highlight]

    Nun serialisiere ich diese mit:

    [highlight=c#]
    var fs = new StreamWriter(filePath, false);
    var serializer = new XmlSerializer(typeof(List<FmeaIdentifier>));
    serializer.Serialize(fs, _identifiers);
    fs.Close();
    [/highlight]

    Nun hab ich aber das Problem das in meinem File nur leere Elemente auftauchen. GetObjectData() wird aufgerufen. Das habe ich schon überprüft.

    Hat jemand einen Tip für mich? Ich möchte die Felder nicht public machen.

    Hoffe jemand kann helfen!

    Vielen Dank schon mal!!!

    Gruß
    Fanderlf

  • #2
    Mit Serializable kenn ich mich nicht aus; ich denke aber, dass das nur für public Member geht (ich glaube, so etwas habe ich mal gelesen). Gruß Jürgen

    Comment


    • #3
      Jaja schon, aber nur wenn man den Standardserialierungsmechanismus verwendet (sprich das [Serializable]-Attribut setzt). Ich habe aber die ISerializable Schnittstelle implementiert und eigentlich sollte er diese verwenden.
      Es ändert sich übrigens auch nichts wenn ich [Serializable] weg lasse.

      Comment


      • #4
        Dem XmlSerializer ist ISerializable und das Serializable Attribut ziemlich egal die wären nur gut für den BinaryFormatter zum serialisieren. XmlSerializer benutzt seine eigenen XML Attribute.

        Ich verstehe nicht warum du Interna per XML serialisieren möchte? Durch die Internas wird ja deine Klasse systemabhängig heißt so kann sie auch nur wieder von deiner NET. Klasse geladen werden. Dann kann ich auch gleich binär serialisieren. Ist schneller und du bekommst die Interna automatisch.

        Wenn du unbedingt Typgenau auch die Interna serialisieren und deserialisieren möchtest sieh dir den NetDataContractSerializer (zu WCF gehörend) an. Das ist der einzige XML Serialisierer denn ich kenne der auch Typinformationen serialisiert und nicht nur die abgreifbare Oberfläche einer Klasse.

        Comment


        • #5
          Das Problem ist dass die Datei menschenlesbar bzw. editierbar sein muss. Das ist eher ein kleines Tool für Leute die wissen wie man damit umgeht. Ich möchte nicht einen riesen Editor für das ganze Dingens bauen. Da hab ich mir gedacht ich serialisier das in XML und wenn jemand ein neues Item in der Liste braucht fügt ers händisch hinzu. Wenns kracht auch egal, ist nur firmenintern.

          Comment


          • #6
            Zur Not bau ich mir eben serialisierungsobjekte dazwischen, die dann eben nur aus Public Properties bestehen. Schön ist zwar was andres, aber das geht dann wenigstens.
            Der Vorteil ist allerdings, dass die Domain Logik dann unabhängig vom Serialisieren ist

            Comment


            • #7
              Ich hab da wohl auch zuviel rein interpretiert. Du willst glaube ich gar keinen genauen Typinformationen sondern nur weitere Daten serialisieren? Dann sollte es ausreichen IXmlSerializable zu implementieren.

              Comment


              • #8
                Ah super Das ist wohl genau das was ich gesucht habe. Habe gerade auch nochmal im INet geguckt, man kann das wohl auch mit Attributen machen.

                [highlight=c#]
                [Serializable]
                public class ProviderInfo {
                NameValueCollection _attributes;
                string _name;

                public ProviderInfo()
                {
                }

                public ProviderInfo(string name, NameValueCollection attributes)
                {
                this._name = name;
                this._attributes = attributes;
                }

                [XmlAttribute]
                public string Name
                {
                get { return _name; }
                set { _name = value; }
                }

                [XmlIgnore]
                public NameValueCollection Attributes
                {
                get { return _attributes; }
                set { _attributes = value; }
                }
                }
                [/highlight]

                Dazu kann man noch das [XmlDescription()] Attribut nehmen um den Tagnamen im XML File festzulegen. Dafür muss die Property aber wohl einen Getter und Setter haben.

                Werd das nachher direkt mal testen

                Wer kann schon ahnen, dass es Unterschiede zwischen einem binary und einem xml Serialiser gibt -.- Dachte ich verwende einfach nen andren serialiser für dasselbe Objekt -.- wenn schon so schön Schnittstellen definiert sind.

                Comment


                • #9
                  So Schnauze voll, wenn ich sowieso schon sämtlichen Xml erzeugenden und lesenden Code selber schreiben darf kann ich mir auch gleich meinen eigenen Speichermechanismus programmieren.

                  Comment

                  Working...
                  X