【问题标题】:how to read binary data ¬ ( ) in xml using c# generated by windows如何使用windows生成的c#读取xml中的二进制数据¬()
【发布时间】:2012-03-26 23:52:12
【问题描述】:

如何使用windows生成的c#读取xml中的二进制数据¬()。 我正在尝试访问列出 windows reg 中的注册表项。 字符串值中弹出二进制数据。我可以使用 xml 序列化将其序列化为 () 但我无法将其反序列化回来? 谁能解释我出了什么问题,为什么?帮我解决这个问题。 非常感谢 :))) 读取时出错:

System.InvalidOperationException 未处理
Message="XML 文档中存在错误 (235, 28)。" 从文件中读取:

public diagnostics readregkey(diagnostics diagnostics, string filename)
{
    diagnostics dia = null;
    using (System.IO.StreamReader sr = 
        new System.IO.StreamReader(filename, Encoding.Unicode))
    {
        System.Xml.Serialization.XmlSerializer x = 
            new System.Xml.Serialization.XmlSerializer(typeof(diagnostics));
        dia = x.Deserialize(sr) as diagnostics;
    }
    return dia;
}

写入文件:

public static void  WriteRegKey(diagnostics diagnostics, string filename)
{
    diagnostic.regKeys.Add(key(Registry.LocalMachine, sKeyGravitas));
    diagnostic.regKeys.Add(key(Registry.CurrentUser, sKeyGravitas));
    using (System.IO.StreamWriter sw = 
        new System.IO.StreamWriter(filename,false, Encoding.Unicode))
    {
        System.Xml.Serialization.XmlSerializer x = 
            new System.Xml.Serialization.XmlSerializer(typeof(diagnostics));
        x.Serialize(sw, diagnostics);
    }
}

【问题讨论】:

标签: c# xml visual-studio-2008


【解决方案1】:

我也遇到了这个问题,为了帮助下一个问题,我把我用来解决的问题留在这里。

正如 lavinio 所说,XML 不能代表每个字符。因此,使用他提供的表格,我编写了一个方法,与另一个问题中的另一个答案非常相似:https://stackoverflow.com/a/641632/2315604,我在序列化之前调用了该方法。

private string XmlCharWhiteList(string p)
{
        StringBuilder stringBuilder = new StringBuilder();
        foreach(char c in p)
        {
            if (c == 0x0009 || c == 0x000A || c == 0x000D ||
                (c >= 0x0020 && c <= 0xD7FF) ||
                (c >= 0xE000 && c <= 0xFFFD))
                stringBuilder.Append(c);
            else
                stringBuilder.Append(' ');
        }
        return stringBuilder.ToString();
}

而且,从 .NET 4.0 开始,您可以使用 XmlConvert.IsXmlChar https://msdn.microsoft.com/en-us/library/system.xml.xmlconvert.isxmlchar%28v=vs.110%29.aspx

【讨论】:

    【解决方案2】:

    XML 文件不能代表每个字符,即使使用 &amp;#x; 表示法也是如此。

    http://www.w3.org/TR/REC-xml/#charsets

    使用不广泛的XML 1.1,可以支持除NUL以外的所有字符。

    但是对于 0x0002,在 XML 中将其表示为 &amp;#x2; 根本就不是正确的格式。

    处理嵌入二进制数据的常用方法是将其转换为 base-64。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 2012-04-30
      • 1970-01-01
      相关资源
      最近更新 更多