Serializacja zagnieżdżonego XML

0

Witajcie.
Potrzebuję pomocy przy serializacji obiektu do XML i odwrotnie.

Pytania.

  1. W jaki sposób odczytać zawartość wszystkich właściwości obiektu utworzonego po deserializacji.
  2. W jaki sposób zserializować i zapisać plik XML ale wypełniając w obiekcie tylko niektóre właściwości dla nie wypełnionych powinny utworzyć się w pliku XML odpowiednie tagi z pustymi wartościami.
  3. W jaki sposób wypełnić gałęzie tagu "E1STATE" przy czym tag ten będzie powtórzony trzy razy (każda sekcja tego tagu będzie miała inne dane) i zserializować obiekt.

Niżej zamieszczam plik XML i jego klasę.

Plik XML.

<?xml version="1.0" encoding="UTF-8" ?> 
<ALE01>
  <ID BEGIN="1" DANE="test">
    <EDI SEGMENT="1">
      <TABNAM>test2</TABNAM>
      <SERIAL>20171116143751</SERIAL>
    </EDI>
    <E1A SEGMENT="1">
      <MEST>test3</MEST>
      <E1STATE SEGMENT="1">
        <DOCNUM>0000000000000000</DOCNUM>
        <STATUS>53</STATUS>
        <E1PRTOB SEGMENT="1">
          <DOCNUM>0000000008708471</DOCNUM>
          <OBJKEY>3100940841</OBJKEY>
        </E1PRTOB>
      </E1STATE>
	  <E1STATE SEGMENT="2">
        <DOCNUM>0000000000000000</DOCNUM>
        <STATUS>12</STATUS>
        <E1PRTOB SEGMENT="1">
          <DOCNUM>000002238708471</DOCNUM>
          <OBJKEY>3140841</OBJKEY>
        </E1PRTOB>
      </E1STATE>
    </E1A>
  </ID>
</ALE01>

oraz jego klasę


/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class ALE01
{

    private ALE01ID idField;

    /// <remarks/>
    public ALE01ID ID
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ALE01ID
{

    private ALE01IDEDI eDIField;

    private ALE01IDE1A e1AField;

    private byte bEGINField;

    private string dANEField;

    /// <remarks/>
    public ALE01IDEDI EDI
    {
        get
        {
            return this.eDIField;
        }
        set
        {
            this.eDIField = value;
        }
    }

    /// <remarks/>
    public ALE01IDE1A E1A
    {
        get
        {
            return this.e1AField;
        }
        set
        {
            this.e1AField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte BEGIN
    {
        get
        {
            return this.bEGINField;
        }
        set
        {
            this.bEGINField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string DANE
    {
        get
        {
            return this.dANEField;
        }
        set
        {
            this.dANEField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ALE01IDEDI
{

    private string tABNAMField;

    private ulong sERIALField;

    private byte sEGMENTField;

    /// <remarks/>
    public string TABNAM
    {
        get
        {
            return this.tABNAMField;
        }
        set
        {
            this.tABNAMField = value;
        }
    }

    /// <remarks/>
    public ulong SERIAL
    {
        get
        {
            return this.sERIALField;
        }
        set
        {
            this.sERIALField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte SEGMENT
    {
        get
        {
            return this.sEGMENTField;
        }
        set
        {
            this.sEGMENTField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ALE01IDE1A
{

    private string mESTField;

    private ALE01IDE1AE1STATE[] e1STATEField;

    private byte sEGMENTField;

    /// <remarks/>
    public string MEST
    {
        get
        {
            return this.mESTField;
        }
        set
        {
            this.mESTField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("E1STATE")]
    public ALE01IDE1AE1STATE[] E1STATE
    {
        get
        {
            return this.e1STATEField;
        }
        set
        {
            this.e1STATEField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte SEGMENT
    {
        get
        {
            return this.sEGMENTField;
        }
        set
        {
            this.sEGMENTField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ALE01IDE1AE1STATE
{

    private byte dOCNUMField;

    private byte sTATUSField;

    private ALE01IDE1AE1STATEE1PRTOB e1PRTOBField;

    private byte sEGMENTField;

    /// <remarks/>
    public byte DOCNUM
    {
        get
        {
            return this.dOCNUMField;
        }
        set
        {
            this.dOCNUMField = value;
        }
    }

    /// <remarks/>
    public byte STATUS
    {
        get
        {
            return this.sTATUSField;
        }
        set
        {
            this.sTATUSField = value;
        }
    }

    /// <remarks/>
    public ALE01IDE1AE1STATEE1PRTOB E1PRTOB
    {
        get
        {
            return this.e1PRTOBField;
        }
        set
        {
            this.e1PRTOBField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte SEGMENT
    {
        get
        {
            return this.sEGMENTField;
        }
        set
        {
            this.sEGMENTField = value;
        }
    }
}

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class ALE01IDE1AE1STATEE1PRTOB
{

    private uint dOCNUMField;

    private uint oBJKEYField;

    private byte sEGMENTField;

    /// <remarks/>
    public uint DOCNUM
    {
        get
        {
            return this.dOCNUMField;
        }
        set
        {
            this.dOCNUMField = value;
        }
    }

    /// <remarks/>
    public uint OBJKEY
    {
        get
        {
            return this.oBJKEYField;
        }
        set
        {
            this.oBJKEYField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public byte SEGMENT
    {
        get
        {
            return this.sEGMENTField;
        }
        set
        {
            this.sEGMENTField = value;
        }
    }
}
0

Serializacja:


...
	    var serializer = new XmlSerializer((objectToSerialize).GetType());

            using (var writer = new StreamWriter("saveFile.xml"))
            {
                serializer.Serialize(writer,objectToSerialize);
            }
...

Deserializacja:

...
var serializer = new XmlSerializer(objectToDeserialize.GetType());
  using (var reader = new StreamReader("fileName.xml"))
{
      XmlReader xmlReader = new XmlTextReader(reader);
      if (serializer.CanDeserialize(xmlReader))
      {
      return serializer.Deserialize(xmlReader);
      }
}
...

Jeśli zdeserializujesz obiekt to będziesz miał dostęp do jego właściwości.

0

Dziękuję za info ale nadal mam problem.
Jak chcę w obiekcie zapisać jakąkolwiek informację dostaję komunikat o błędzie.
"Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu"

var obiekt1 = new ALE01();

            obiekt1.ID.BEGIN = 1;  //<-- tu wywala się program

            var serializer = new XmlSerializer((obiekt1).GetType());

            using (var writer = new StreamWriter(@"e:\Onico\Visual C#\ConsoleApplication3\ConsoleApplication3\XLM TEST.xml"))
            {
                serializer.Serialize(writer, obiekt1);
            }
            Console.ReadKey();
0

Kurcze czy ja dobrze czaję żeby serializować w tym przypadku obiekt muszę tworzyć poniższe obiekty i dopiero wypełniać właściwości tych obiektów.

ALE01 objekt1 = new ALE01();
ALE01ID objekt2 = new ALE01ID();
ALE01IDEDI objekt3 = new ALE01IDEDI();
ALE01IDE1A objekt4 = new ALE01IDE1A();
ALE01IDE1AE1STATE objekt5 = new ALE01IDE1AE1STATE();
ALE01IDE1AE1STATEE1PRTOB objekt6 = new ALE01IDE1AE1STATEE1PRTOB();

Czyli właściwie dla każdego węzła w XML musi być utworzony oddzielny obiekt ?
Jeżeli tak to jest to jaka jest przewaga serializacji w tworzeniu/odczycie wartości tagów i argumentów nad operowaniem na strukturze DOM.

0

Jak nie będziesz miał obiektów to nie będziesz miał co serializować. Ale nie musisz wypełniać właściwości, domyślnie serializer zapisze ją bez żadnej wartości. A żeby nie serializować każdego osobno, zrób sobie listę, albo klasę nadrzędną i ją serializuj. Możesz też stworzyć XML i go zdeserializować. Tak czy siak musisz coś napisać.


obiekt1.ID.BEGIN = 1;  //<-- tu wywala się program

Masz obiekt obiekt1, ale ID masz puste.

P.S. A swoją droga nie możesz trochę tego uprościć? Zrobić auto-properties? I te nazwy żeby były bardziej czytelne? Zamiast obiekt.ID zrobić tablicę i wtedy obiekt[id], nie musiałbyś kopać przez tyle właściwości.

1 użytkowników online, w tym zalogowanych: 0, gości: 1