Я сохраняю список объектов как XML со следующим кодом в Windows Project Project.
SaveFileDialog1.ShowDialog()
Dim Path = SaveFileDialog1.FileName
Dim file As StreamWriter
System.IO.File.WriteAllText(Path, "")
file = My.Computer.FileSystem.OpenTextFileWriter(Path, False)
Dim ser As New XmlSerializer(GetType(List(Of Player)))
ser.Serialize(file, PlayerList)
file.WriteLine(ser)
file.Close()
И чтение его обратно с помощью:
OpenFileDialog1.ShowDialog()
Dim Path = OpenFileDialog1.FileName
Dim reader As New System.Xml.Serialization.XmlSerializer(GetType(List(Of Player)))
Dim filereader As New System.IO.StreamReader(Path)
PlayerList = reader.Deserialize(filereader)
Файл выглядит правильно, вот что получается, когда у меня в списке два объекта:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfPlayer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Player>
<Name>Kennedy Igboananike</Name>
<Control>999</Control>
<Tackling>999</Tackling>
<Passing>999</Passing>
<Heading>999</Heading>
<Shooting>1000</Shooting>
<Speed>731</Speed>
<Age>30</Age>
</Player>
<Player>
<Name>Dean Wormall</Name>
<Control>408</Control>
<Tackling>390</Tackling>
<Passing>579</Passing>
<Heading>428</Heading>
<Shooting>449</Shooting>
<Speed>719</Speed>
<Age>17</Age>
</Player>
</ArrayOfPlayer>System.Xml.Serialization.XmlSerializer
Но при попытке прочитать его обратно я получаю сообщение об ошибке:
Данные на уровне root недопустимы. Строка X, позиция 17
, что соответствует сразу после /ArrayOfPlayer
и началу System.Xml
... et c.
Из того, что я могу сказать, глядя на другие примеры xml, окончательный System.Xml.Serialization.XmlSerializer
не должен быть там и, похоже, вызывает проблему, но я не могу понять из своего кода, почему это присоединяется в конце. Я пытаюсь это с совершенно пустыми файлами, так что это ничего из предыдущей записи.
Код взят из разных мест, так что это немного ми sh -ma sh, так как я пытался решить, как сериализовать / десериализовать список объектов.
Мой класс находится в отдельном файле и выглядит так:
<Serializable>
Public Class Player
Public Property Name As String
Public Property Control As Integer
Public Property Tackling As Integer
Public Property Passing As Integer
Public Property Heading As Integer
Public Property Shooting As Integer
Public Property Speed As Integer
Public Property Age As Integer
End Class