Я изменяю приложение VB.NET для использования XmlSerializer вместо XMLDocument для чтения/записи в файл настроек XML и сохранения обратной совместимости.Deserialize Существующий XML-файл в VB.NET
Вот пример содержимого XML-файла:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<postHistory>
<postFile>a.txt</postFile>
<postFile>b.txt</postFile>
<postFile>c.txt</postFile>
</postHistory>
</appSettings>
<SettingsPath>d.txt</SettingsPath>
</configuration>
Вот классы я придумал, что правильно десериализации исходный файл.
Imports System.Xml.Serialization
Imports System.Collections.Generic
<XmlRoot("configuration")>
Public Class LocalSettings
<XmlElement("appSettings")>
Public appSettings As New postHistory()
Public SettingsPath As String = ""
End Class
Public Class postHistory
Public postHistory As New SubSettings()
End Class
Public Class SubSettings
<XmlElement("postFile")>
Public postHistory As New List(Of String)
End Class
Это код, используемый для десериализации файла:
Public Shared Function GetLocalSettings(ByVal filePath As String) As LocalSettings
Dim lSettings As New LocalSettings()
Try
Dim xs As New XmlSerializer(GetType(LocalSettings))
Using fs As New FileStream(filePath, FileMode.Open)
lSettings = xs.Deserialize(fs)
End Using
Catch ex As Exception
' Handle exception
End Try
Return lSettings
End Function
Это решение работает, но чувствует себя неловко. Есть ли более оптимальный способ де-сериализации, который не требует вложения списка «postHistory» в двух подклассах?
Что генерирует этот XML? Кажется, что у него есть стандартный файл app.config, пока вы не дойдете до содержимого 'appSettings'. Возможно, что есть лучший способ сделать это, но на ум приходит на ум две вещи: 1) это происходит, потому что это то, что представляет собой макет вашего XML, а XMLDeserializer наивна, ожидая создания объекты на основе структуры XML; и 2) Он работает, я бы пошел с этим. – Adrian
Только если вы измените xml и удалите тег posthistory. – jdweng
Благодарим вас за предложения обратной связи. Я хочу, чтобы решение было максимально простым, и просто искал любые альтернативы в рамках .NET-сериализации. – gotorg