Hi Vampire666,
(die Nachricht ist zu lang? was soll das denn??)
ich danke dir für deine Mühe, aber so weit (mindestens!) war ich schon. Aber anhand deines Beispiels kann ich vielleicht klarer erklären worum es geht.
Erstens will ich ein Array serialisieren, das ginge z.B. so:
' Array of customer
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button2.Click
' XmlSerializer Object erstellen für die KLasse
Dim ser As New XmlSerializer(GetType(Customer()))
'nun ein Objekt erstellen für die Klasse Customer
Dim acust() As Customer = {New Customer(1, "Vampire", Nothing, _
"Mannheim"), _
New Customer(2, "DaveS", Nothing, _
"München")}
' Datei öffnen
Dim fs As New FileStream("c:\customer.xml", FileMode.Create)
'Das Object in den Stream serialisieren und schließen
ser.Serialize(fs, acust)
fs.Close()
'Stream nochmal öffnen
Dim fs2 As New FileStream("c:\customer.xml", FileMode.Open)
' Deserialize die Datei in ein andere Customer Object und danach wieder
' schließen
Dim acust2() As Customer = CType(ser.Deserialize(fs2), Customer())
fs2.Close()
'Prüfe die Eigenschaften
MsgBox(acust2(0).Name & ", " & acust2(0).City + vbCrLf + _
(acust2(1).Name & ", " & acust2(1).City))
End SubDas bringt als xml
<?xml version="1.0"?>
<ArrayOfCustomer xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Customer>
<ID>1</ID>
<Name>Vampire</Name>
<City>Mannheim</City>
</Customer>
<Customer>
<ID>2</ID>
<Name>DaveS</Name>
<City>München</City>
'</Customer>
'</ArrayOfCustomer>
Allerdings will ich "CustomerItems" anstatt "ArrayOfCustomer" und "Item" anstatt "Customer" (es geht darum , dass wir Klassen haben mit langen Namen die als Web Requests geschickt werden sollen, und ich will die Klassen nicht umbenennen, um das die Daten wesentlich kurzer werden).
Ich kann zwar den Rootnamen ändern mit
Dim ser As New XmlSerializer(GetType(Customer()), New XmlRootAttribute("CustomerItems"))
aber nicht <Customer>
Mit einer Klasse wie
Imports System.Xml.Serialization
Public Class Customers
<XmlArray("CustomerItems"), _
XmlArrayItem("Item")> _
Public acust() As Customer
Public Sub New(ByVal init As Boolean)
If init Then
acust = New Customer() {New Customer(1, "Vampire", Nothing, _
"Mannheim"), _
New Customer(2, "DaveS", Nothing, _
"München")}
End If
End Sub
End Classkann ich die Attribute XmlArray und XmlArrayItem benutzen, und mit folgendem Code
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles Button3.Click
' XmlSerializer Object erstellen für die KLasse
Dim ser As New XmlSerializer(GetType(Customers))
'nun ein Objekt erstellen für die Klasse Customer
Dim custs As New Customers(True)
' Datei öffnen
Dim fs As New FileStream("c:\customer.xml", FileMode.Create)
'Das Object in den Stream serialisieren und schließen
ser.Serialize(fs, custs)
fs.Close()
'<?xml version="1.0"?>
'Stream nochmal öffnen
Dim fs2 As New FileStream("c:\customer.xml", FileMode.Open)
' Deserialize die Datei in ein andere Customer Object und danach wieder
' schließen
Dim custs2 As Customers = CType(ser.Deserialize(fs2), Customers)
fs2.Close()
'Prüfe die Eigenschaften
MsgBox(custs2.acust(0).Name & ", " & custs2.acust(0).City + vbCrLf + _
(custs2.acust(1).Name & ", " & custs2.acust(1).City))
End Subhabe ich dann dieses Ergebnis:
<Customers xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CustomerItems>
<Item>
<ID>1</ID>
<Name>Vampire</Name>
<City>Mannheim</City>
</Item>
<Item>
<ID>2</ID>
<Name>DaveS</Name>
<City>München</City>
</Item>
</CustomerItems>
</Customers>
Erfolg! |