Xml Beschreibungen für serialisierte Objekte

  • VB.NET
  • .NET 7–8

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Xml Beschreibungen für serialisierte Objekte

    Neu

    Moin,


    für ein zu serialisierendes Objekt möchte ich die Bezeichnung der Knoten in der Xml Datei anpassen.
    Hierbei handelt es sich um ein eine Beispiel Klasse, die eigentliche Klasse und Eigenschaften sind später anders.

    Das Listen Objekt enthält über

    Quellcode

    1. Inherits
    eine

    Quellcode

    1. List (Of Object)
    , da ich diese nicht als extra Property der Klasse zuweisen möchte.

    VB.NET-Quellcode

    1. <XmlRoot("List")> Public NotInheritable Class ListObject : Inherits List(Of ListItem)
    2. Sub New()
    3. End Sub
    4. Public Overloads Sub Add(Text As String)
    5. With Me
    6. .Add(New ListItem With {.Text = Text, .CreateDate = Date.Now})
    7. End With
    8. End Sub
    9. End Class


    Dazu passend das ListItem

    Visual Basic-Quellcode

    1. <XmlRoot("Entry")> Public NotInheritable Class ListItem
    2. Public Property ID As Integer = 0
    3. Public Property Text As String = String.Empty
    4. <XmlElement("ErstelltAm")> Public Property CreateDate As Date
    5. Sub New()
    6. End Sub
    7. End Class


    Erstellt wird eine Xml Datei über ...

    VB.NET-Quellcode

    1. Dim OutputFile As New IO.FileInfo(IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "XmlOut", "ItemList.xml"))
    2. With OutputFile.Directory
    3. If Not .Exists Then .Create()
    4. End With
    5. Dim Obj As New ListObject()
    6. Obj.Add("Test1")
    7. Obj.Add("Test2")
    8. Obj.Add("Test3")
    9. Dim XSZ As New XmlSerializer(GetType(ListObject))
    10. Using Stream As New IO.FileStream(OutputFile.FullName, IO.FileMode.Create)
    11. XSZ.Serialize(Stream, Obj)
    12. End Using


    Funktioniert soweit auch.

    Die erstellte Xml Datei sieht nun aber so aus.

    XML-Quellcode

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <List xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    3. <ListItem>
    4. <ID>0</ID>
    5. <Text>Test1</Text>
    6. <ErstelltAm>2024-10-16T12:17:22.8440319+02:00</ErstelltAm>
    7. </ListItem>
    8. <ListItem>
    9. <ID>0</ID>
    10. <Text>Test2</Text>
    11. <ErstelltAm>2024-10-16T12:17:22.8440782+02:00</ErstelltAm>
    12. </ListItem>
    13. <ListItem>
    14. <ID>0</ID>
    15. <Text>Test3</Text>
    16. <ErstelltAm>2024-10-16T12:17:22.8440797+02:00</ErstelltAm>
    17. </ListItem>
    18. </List>


    Der Knoten für <ListItem> (Zeile 3 der Xml Datei) wurde nicht auf <XmlRoot("Entry")> angepasst.

    An welcher Stelle lässt sich die Bezeichnung dieses Knotens für die Xml Datei ändern?
    Die Objekte sollen weiterhin andere Bezeichnungen haben, diese kann ich nicht ändern.

    Grüße :)

    Neu

    @BlueLagoonX Probiere es doch mal anders herum.
    Erstelle manuell Deine XML-Datei und lass das Studio für diese XML-Datei eine entsprechende Klasse generieren:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Damit erhalte ich zwar eine Klasse zurück, diese entspricht aber nicht meiner.


    VB.NET-Quellcode

    1. ​Public NotInheritable Class ListObject : Inherits List(Of ListItem)


    wurde nicht erstellt (logisch, ich denke dass VS das so nicht erkennen kann aus der Xml Datei)

    Stattdessen wurde der Klasse eine Property ​Public Property Entry() As ListEntry() hinzugefügt.
    Ist leider nicht ganz das, was ich suche.

    VB.NET-Quellcode

    1. ' HINWEIS: Für den generierten Code ist möglicherweise mindestens .NET Framework 4.5 oder .NET Core/Standard 2.0 erforderlich.
    2. '''<remarks/>
    3. <System.SerializableAttribute(),
    4. System.ComponentModel.DesignerCategoryAttribute("code"),
    5. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True),
    6. System.Xml.Serialization.XmlRootAttribute([Namespace]:="", IsNullable:=False)>
    7. Partial Public Class List
    8. Private entryField() As ListEntry
    9. '''<remarks/>
    10. <System.Xml.Serialization.XmlElementAttribute("Entry")>
    11. Public Property Entry() As ListEntry()
    12. Get
    13. Return Me.entryField
    14. End Get
    15. Set
    16. Me.entryField = Value
    17. End Set
    18. End Property
    19. End Class
    20. '''<remarks/>
    21. <System.SerializableAttribute(),
    22. System.ComponentModel.DesignerCategoryAttribute("code"),
    23. System.Xml.Serialization.XmlTypeAttribute(AnonymousType:=True)>
    24. Partial Public Class ListEntry
    25. Private idField As Byte
    26. Private textField As String
    27. Private erstelltAmField As Date
    28. '''<remarks/>
    29. Public Property ID() As Byte
    30. Get
    31. Return Me.idField
    32. End Get
    33. Set
    34. Me.idField = Value
    35. End Set
    36. End Property
    37. '''<remarks/>
    38. Public Property Text() As String
    39. Get
    40. Return Me.textField
    41. End Get
    42. Set
    43. Me.textField = Value
    44. End Set
    45. End Property
    46. '''<remarks/>
    47. Public Property ErstelltAm() As Date
    48. Get
    49. Return Me.erstelltAmField
    50. End Get
    51. Set
    52. Me.erstelltAmField = Value
    53. End Set
    54. End Property
    55. End Class

    Neu

    BlueLagoonX schrieb:

    Ist leider nicht ganz das, was ich suche.
    Jetzt hast Du also zwei Klassen, die (hoffentlich) dieselbe XML-Datei generieren.
    Erkunde die Unterschiede und gestalte Deine Klasse nach Deinen Wünschen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!