【问题标题】:I cant deserialize xml file, there is always something wrong我无法反序列化 xml 文件,总是有问题
【发布时间】:2014-07-16 11:21:46
【问题描述】:

所以在我的 winrt 应用程序上,我试图从我的一个应用程序文件夹上的 xml 文件加载一个类,但我遇到了一个问题,无论我做什么都会有问题,或者我有一个 missing file exception或者我有一个Data at the root level is invalid. Line 1, position 1. 下面是我尝试加载类的方式: 路径 = "<?xml version="1.0" encoding="utf-8" standalone="yes"?><cards></cards>"

    Dim instance As T
    Dim b As Byte() = Encoding.UTF8.GetBytes(path.ToString())
    Dim Stream As New MemoryStream(b)

    Dim serializer As XmlSerializer = New XmlSerializer(Type)
    Dim reader As StreamReader = New StreamReader(Stream)
    instance = DirectCast(serializer.Deserialize(reader), T)
    Return instance

instance = DirectCast(serializer.Deserialize(reader), T) 线上我得到一个System.IO.FileNotFoundException.. 好吧,让我们传递文件路径,在这种情况下 path = "ms-appx:///Data/cardsDB.xml"

    Using reader2 As TextReader = New StringReader(path)
        Dim xml2 As New XmlSerializer(Type)
        instance = DirectCast(xml2.Deserialize(reader2), T)
    End Using
    Return instance

在同一行,instance = DirectCast(serializer.Deserialize(reader), T),在这种情况下,我得到Data at the root level is invalid. Line 1, position 1.,这实际上是正确的,因为如果我调试该行并打开reader2 选项,我可以看到_s = "ms-appx:///Data/cardsDB.xml".. 现在我真的迷路了在这里,如果我传递一个路径,我看不到 xml,当我传递 xml 时,我找不到文件。有人可以解释一下如何做到这一点:(

另外,当我在 vb 中使用 wpf 编程时,streamreader 可以获取字符串作为参数,在 winrt 上,streamreader 只能获取 io.stream..

上面使用的类是我在所有 wpf 应用程序中拥有和使用的标准类,它运行良好,仅在 winrt 上我对此感到非常痛苦..

谢谢。

【问题讨论】:

  • 首先,我认为如果是我的代码,您的路径格式 (ms-appx:///Data/cardsDB.xml) 会有些可疑(也许编译器不喜欢使用 "/" 而不是 "\")。如果我是你,我会尝试将其放在C:\test(例如)下并将其加载为"C:\test\cardsDB.xml"?否则,如果我们无法查看您的 xml 文件的内部,我们无法为您提供第二条错误消息 (Data at the root level is invalid) 的帮助。
  • 我将尝试从“/”更改为“\”,我将报告有关 xml 文件内部的内容。我的问题是关于它的外观,但我会复制它又在这里: path = ""
  • 从“/”更改为“\”无效。我仍然遇到相同的例外情况,无论如何都感谢您的尝试。

标签: vb.net windows-phone-8 windows-store-apps


【解决方案1】:

首先,在xml文件的Properties中,Build Action应该是Content。

然后,要打开内容文件,您需要执行以下操作(抱歉,它是在 C# 中,因为我不太了解 VB 语法):

var uri = new Uri("ms-appx:///Data/cardsDB.xml", UriKind.Absolute);
var file = await StorageFile.GetFileFromApplicationUriAsync(uri);
var stream = await file.OpenStreamForReadAsync();

注意: OpenStreamForReadAsync 是一种扩展方法,您需要为其添加using System.IO;。此外,您添加此代码的方法必须是异步的。

现在您只需要将这个stream 变量传递给XmlSerializer 的Deserialize 方法。

【讨论】:

  • 我已经尝试过“GetResourceStream”,但它看起来不存在。我明白了:'GetResourceStream 不是 Windows.UI.Xaml.Application 的成员'
  • @Rui 我明白了。您应该明确表示它是一个 WP 8.1 非 SL 应用程序(XAML 应用程序或这些应用程序)。我更改了该版本框架的代码。 :)
  • 非常感谢,我真的在网上浪费了 2 天时间,却找不到任何东西(好吧,当我尝试使用 storagefile 时,我已经很接近了)。是的对不起,如果我不清楚..
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2011-06-07
  • 1970-01-01
相关资源
最近更新 更多