XML序列化成功反序列化失败以及xml 十六进制值 0x0E)是无效的字符

出现XML序列化成功,但是反序列化失败问题

可能由于被序列化的对象中包含低序位非打印 ASCII 字符例如字符:

 

字符在序列化时会把把一个字符串中的 低序位 ASCII 字符 替换成 &#x 编码字符

例如

<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserName>好&#xE;强大</UserName>
</User>

例如&#xE;就是编码后的  字符

/// 把一个字符串中的 低序位 ASCII 字符 替换成16进制s字符   
/// 转换 ASCII 0 - 8 -> � - 
/// 转换 ASCII 11 - 12 -> -
/// 转换 ASCII 14 - 31 ->  - 
/// </summary>
/// <param name="tmp"></param>
/// <returns></returns>
public static string ReplaceLowOrderASCIICharacters(string tmp)

{
StringBuilder info = new StringBuilder();
foreach (char cc in tmp)
{
int ss = (int)cc;
if (((ss >= 0) && (ss <= 8)) || ((ss >= 11) && (ss <= 12)) || ((ss >= 14) && (ss <= 32)))
info.AppendFormat("{0:X};", ss);
else info.Append(cc);
}
return info.ToString();
}

如果反序列化时未给这种&#xE;做特殊处理,反序列化将失败,

处理方式如下:

1.序列化时给此类字符做特殊编码

2.在反序列化时替换掉

 

 

如果xml中包含有未编码的低位字符,XmlDocument对象将报错

例如

 

1.txt文件内容如下

<?xml version="1.0"?>
<User xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <UserName>好强大</UserName>
</User>

好有红色标记的低位特殊字符,所有xml需要将这类字符替换掉

 

替换掉未编码的低位序列字符,例如替换掉:

 

   public static string Repalce(string str)
{
return System.Text.RegularExpressions.Regex.Replace(str, @"[\x00-\x08]|[\x0B-\x0C]|[\x0E-\x1F]", "");
}


替换后xml正常加载

posted @ 2012-04-02 10:39  lichaoxyz  阅读(2785)  评论(0编辑  收藏  举报