如何使用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);
}
}
答案 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