【问题标题】:Deserializing (Universal App) XML serialized with vb.net反序列化(通用应用程序)用 vb.net 序列化的 XML
【发布时间】:2016-04-16 12:11:14
【问题描述】:

我在 Windows 窗体应用程序中使用 vb.net 序列化一个类 (PSD):

Dim objStreamWriter As New System.IO.StreamWriter("e:\test.xml")
Dim x As New System.Xml.Serialization.XmlSerializer(PSD.GetType)
x.Serialize(objStreamWriter, PSD)
objStreamWriter.Close()

我需要在 Windows 通用应用程序中反序列化该类。 到目前为止,这是我的代码:

Dim picker As Windows.Storage.Pickers.FileOpenPicker = New Windows.Storage.Pickers.FileOpenPicker
picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail
picker.FileTypeFilter.Add(".xml")
Dim File As Windows.Storage.StorageFile = Await picker.PickSingleFileAsync
Dim Fl = Await File.OpenAsync(Windows.Storage.FileAccessMode.Read)
Dim inStream As Stream = Fl.AsStreamForRead()
Dim PSD As New PlatinaStammdaten
Dim serializer = New XmlSerializer(GetType(List(Of PlatinaStammdaten)), New Type() {GetType(PlatinaStammdaten)})
PSD = serializer.Deserialize(inStream)

我得到的是错误“XML 文档 (2, 2) 中存在错误。”

这是生成的 XML 文件的开头:

<?xml version="1.0" encoding="utf-8"?>
<Stammdaten xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Lose>
    <Los>
      <Name>Sonstige</Name>
      <KZ>000</KZ>
    </Los>
    <Los>
      <Name>LOS 1; Allgemein / Planung</Name>
      <KZ>110</KZ>
    </Los>
    ...

我的代码中有什么错误(写入或读取)导致该错误?

【问题讨论】:

  • 要查找 xml 错误,请使用以下菜单:项目:添加新项目:XML 文件。然后将xml文件粘贴到窗口中。错误将像错误列表窗口中的任何编译器错误一样显示。

标签: xml vb.net win-universal-app xmlserializer


【解决方案1】:

我现在开始工作了。 这是我现在的反序列化代码:

Dim picker As Windows.Storage.Pickers.FileOpenPicker = New Windows.Storage.Pickers.FileOpenPicker
        picker.FileTypeFilter.Add(".xml")
        Dim File As Windows.Storage.StorageFile = Await picker.PickSingleFileAsync
        Dim Fl = Await File.OpenAsync(Windows.Storage.FileAccessMode.Read)
        Dim FileZiel As Windows.Storage.StorageFile = Await File.CopyAsync(FolderZiel, File.Name, Windows.Storage.NameCollisionOption.ReplaceExisting)
        Dim Fl2 = Await FileZiel.OpenAsync(Windows.Storage.FileAccessMode.ReadWrite)
        Dim inStream2 As Stream = Fl2.AsStreamForRead()
        Dim sr As StreamReader = New StreamReader(inStream2)
        Dim PSD As New PlatinaStammdaten
        Dim x As New XmlSerializer(PSD.GetType)
        PSD = x.Deserialize(sr)
        sr.Dispose()

【讨论】:

    【解决方案2】:

    看起来您正在尝试将列表反序列化为单个实例

    将 PSD 调暗为新 PlatinaStammdaten Dim 序列化程序 = 新 XmlSerializer(GetType(List(Of PlatinaStammdaten)), New Type() {GetType(PlatinaStammdaten)}) PSD = serializer.Deserialize(inStream)

    尝试将 PSD 更改为

    Dim PSD As List(of PlatinaStammdaten)
    

    由于我们看不到完整的 xml 或您将 xml 放入的类,因此很难判断您是否会遇到任何其他错误

    【讨论】:

    • 你在正确的轨道上,但 OP 正在序列化单个 PSD,而不是列表,因此必须反序列化为单个。
    • 是的,我有三个类:Ca、Cb 和 Cc(对于这个例子)。在序列化之前,我将这些类 Dim LA 的三个列表创建为列表 (Of Ca) 等等。我的类 PSD 包含三个属性(类型:列表),我只序列化一个 PSD 实例 - 所以它只是一个对象。我的方法是,我反序列化这个类,所以我再次得到三个列表
    【解决方案3】:

    下面的代码有效

    Imports System.Xml
    Imports System.Xml.Serialization
    Imports System.IO
    
    Module Module1
        Const FILENAME As String = "c:\temp\test.xml"
        Sub Main()
            Dim xs As XmlSerializer = New XmlSerializer(GetType(PlatinaStammdaten))
            Dim reader As XmlTextReader = New XmlTextReader(FILENAME)
            Dim PSD As PlatinaStammdaten = CType(xs.Deserialize(reader), PlatinaStammdaten)
    
        End Sub
    
    End Module
    <XmlRoot("Stammdaten")> _
    Public Class PlatinaStammdaten
        Private m_lose As Lose
        <XmlElement("Lose")> _
        Public Property _lose As Lose
            Get
                Return m_lose
            End Get
            Set(ByVal value As Lose)
                m_lose = value
            End Set
        End Property
    End Class
    
    <Serializable(), XmlRoot("Lose")> _
    Public Class Lose
        Private m_los As List(Of Los)
        <XmlElement("Los")> _
        Public Property _los As List(Of Los)
            Get
                Return m_los
            End Get
            Set(ByVal value As List(Of Los))
                m_los = value
            End Set
        End Property
    
    End Class
    
    <Serializable(), XmlRoot("Los")> _
    Public Class Los
        Private m_Name As String
        <XmlElement("Name")> _
        Public Property name As String
            Get
                Return m_Name
            End Get
            Set(ByVal value As String)
                m_Name = value
            End Set
        End Property
    
        Public m_KZ As Integer
        <XmlElement("KZ")> _
        Public Property KZ As Integer
            Get
                Return m_KZ
            End Get
            Set(ByVal value As Integer)
                m_KZ = value
            End Set
        End Property
    
    End Class
    
    '<Lose>
    '  <Los>
    '    <Name>Sonstige</Name>
    '    <KZ>000</KZ>
    '  </Los>
    '  <Los>
    '    <Name>LOS 1; Allgemein / Planung</Name>
    '    <KZ>110</KZ>
    '  </Los>
    '</Lose>
    

    【讨论】:

    • 我试图理解这一点。你从哪里得到 XmlTextReader?在我的 Windows 通用应用程序中,它无法识别。 (正如我所写:我在 Windows 窗体应用程序中序列化并在 Windows 通用应用程序中反序列化。而 Lose 在我的代码中不是一个类,而是一个列表(Los)。我需要将该列表放入一个类中吗?跨度>
    • 我无法提供第 3 方代码。只是 VS/Net 代码。 XmlTextReader 是 System.Xml 命名空间中的网络库类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2013-09-19
    相关资源
    最近更新 更多