tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
576
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    StehtimSchilf StehtimSchilf ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    117
    Hoi Forum, ich nochmals.

    Ich habe eine simple Klasse wie folgt:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    
    Serializable(), XmlRoot(ElementName="ServerResponse")]
    public class ServerResponse {
        [XmlElement("Code")]
        public int Code { get; set; }
     
        [XmlElement("Value")]
        public String Value { get; set; }
    }

    Bisher habe ich hier nur ints und strings verwendet.

    Jetzt wäre es jedoch praktisch, wenn ich in Value wiederum ein XML schreiben könnte, damit ich auf der anderen Seite das XML wieder rauslesen kann.

    Nur, wenn ich bspw.:

    Code :
    1
    
    this.Value = "<TestNode><SubNode1>bla</SubNode1></TestNode>";

    erhalte ich (logischerweise) auf nach dem Serialisieren als Inhalt in "Value":
    &lt;TestNode&gt;&lt;SubNode1&gt;bla&lt;/SubNode1&gt;&lt;/TestNode&gt;

    Das möcht ich aber nicht, sondern eben ein nicht HTML kodiertes XML.

    Die Klasse ServerResponse wird immer als Kindelement serialisiert:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    <Bla1>
        <ServerResponse>
            <Code>1234</Code>
            <Value>Hallo Welt</Value>
        </ServerResponse>
    </Bla1>
     
    <Bla2>
        <ServerResponse>
            <Code>133</Code>
            <Value>1111</Value>
        </ServerResponse>
    </Bla2>

    Nun möchte ich eben eine weiteres ParentElement erstellen, bei dem jedoch Value eine XML-Struktur enthält:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    <Bla3>
        <ServerResponse>
            <Code>133</Code>
            <Value>
                <TestNode>
                    <SubNode1>1</SubNode1>
                    <SubNode2>asdf</SubNode2>
                    <SubNode3>12.12.2011</SubNode3>
                </TestNode>
            </Value>
        </ServerResponse>
    </Bla3>

    Die "andere Seite" weiss also, dass wenn "bla3" daherkommt, ist in in Value eine XML-Struktur enthalten. Natürlich kann ich dann einfach sagen, dann muss man eben Value noch HTML dekodieren. Aber das finde ich nicht schön.

    Wie könnt ich das lösen?

    ich hab mir natürlich auch überlegt, für "TestNode" wiederum eine Klasse zu machen und diese wieder zu serialisieren, aber das löst das Problem nicht, dass ich einmal einen String haben möchte und einmal eine XML-Struktur.

    Auch könnte ich die Klasse "TestNode" direkt als Kindelement an Bla3 anhängen, aber das gefällt mir nicht, da ich dann nicht einfach nur den Wert von Value auslesen muss.

    Kann ich den ein Property vom Typ Object erstellen und der Serializier merkt dann, aha, das ist vom Typ String, ich serialisier das mal einfach so, aha das ist vom Typ TestNode, ich serialisier das gemäss den Angaben in der Klasse?

    Am allerliebsten wäre mir jedoch, wenn der Serializer mein Value als XmlNode behandelt und nur die Inhalte serialisiert, aber nicht die Xml-Tags.

    hmmm... Ideen?

    cheerioh & thx
    SiS
     

  2. #2
    StehtimSchilf StehtimSchilf ist offline Mitglied Gold
    Registriert seit
    Oct 2003
    Beiträge
    117
    4h und 4 Cafés.... aber nun hab ich was gefunden:

    Ich habe die Klasse "ServerResponse" nun doch um ein neues Property "AdditionalData" ergänzt (das alte String-Property kann ich dann ja mal entfernen).

    Wie erwähnt, habe ich dazu auch eine neue Klasse geschrieben, recht simpel:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    [XmlRoot(ElementName="AdditionalData"),
    XmlInclude(typeof(String)), XmlInclude(typeof(TestNode))]
    public class AdditionalData {
        [XmlElement("Value")]
        public Object Value { get; set; }
     
        public AdditionalData() {
            // for serialization            
        }
        public AdditionalData(object Value) {
            this.Value = Value;
        }
    }

    Die ServerResponse-Klasse so:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    [Serializable(), XmlRoot(ElementName = "ServerResponse")]
    public class ServerResponse{
        [XmlElement("Code")]
        public int Code { get; set; }
     
        [Obsolete("Retreive Value from AdditionalData/Value")]
        [XmlElement("Value")]
        public String Value { get; set; }
     
        [XmlElement("AdditionalData")]
        public AdditionalData AdditionalData { get; set; }
    }

    Jiu und nun kann ich wahlweise:

    Code :
    1
    2
    3
    4
    5
    
    ServerResponse response = new ServerResponse();
    response.Code = bla();
    response.AdditionalData = new AdditionalValue("hello World");
    string xml = response.Serialize();
    ...

    oder eben:

    Code :
    1
    2
    3
    4
    5
    6
    
    ServerResponse response = new ServerResponse();
    response.Code = bla();
    TestNode tn = new TestNode(1, 2, 3, "A", "B", "C");
    response.AdditionalData = new AdditionalValue(tn);
    string xml = response.Serialize();
    ...

    Ich glaube ich bin so zufrieden, ausser jemand hat Einwände?

    cheerioh SiS
    Geändert von StehtimSchilf (08.02.11 um 02:25 Uhr) Grund: Formatierung
     

  3. #3
    Avatar von Shakie
    Shakie Shakie ist offline Mitglied Diamant
    Registriert seit
    May 2004
    Ort
    Europa
    Beiträge
    2.048
    Ich hab's nicht ganz kapiert, was du machen willst, aber vielleicht findest du das IXmlSerializable-Interface ganz nützlich.
     
    hihi = -h²

Ähnliche Themen

  1. jQuery - mehrere Events wahlweise um Funktion auszulösen?
    Von shredder01 im Forum Javascript & Ajax
    Antworten: 4
    Letzter Beitrag: 09.09.10, 18:49
  2. XmlNode() serialisieren Remoting
    Von Gloki im Forum .NET Web und Kommunikation
    Antworten: 17
    Letzter Beitrag: 07.04.08, 13:25
  3. C# SQL String auch für mySQL ?
    Von WeitiHG im Forum .NET Café
    Antworten: 4
    Letzter Beitrag: 09.10.07, 13:02
  4. Antworten: 2
    Letzter Beitrag: 29.03.05, 19:14
  5. Flash: Schaltfläche wahlweise einblenden
    Von Peter Clark im Forum Flash Plattform
    Antworten: 2
    Letzter Beitrag: 21.04.04, 21:39