如何使用windows生成的c#读取xml中的二进制数据¬(?)

时间:2012-03-09 14:23:39

标签: c# xml visual-studio-2008

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

  

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);
    }
}

2 个答案:

答案 0 :(得分:2)

即使使用&#x;表示法,XML文件也无法代表每个字符。

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

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

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

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

答案 1 :(得分: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