问题:
比较老的WinForm程序,使用WebService访问数据。今天突然报错【其他信息: XML 文档(1014, 6250)中有错误。】
解决思路:
之前用着一直都没有问题,知道应该不是程序本身出了什么问题。跟断点调试发现WebService可以正常访问和返回数据,由此可以判断是因为WebService将数据序列化为XML时没有成功,于是想着自己手动序列化一下看看问题出在哪里。
百度了一个数据对象转XML的代码:
// 1. 首先要创建或者得到一个数据对象
Order order = GetOrderById(123);
// 2. 用序列化的方法生成XML
string xml = XmlHelper.XmlSerialize(order, Encoding.UTF8);
// 3. 从XML读取数据并生成对象
Order order2 = XmlHelper.XmlDeserialize<Order>(xml, Encoding.UTF8);
XmlHelper是一个工具类。转发地址 https://www.cnblogs.com/fish-li/archive/2013/05/05/3061816.html#_label0
转换时报错【{"“\u001f”(十六进制值 0x1F)是无效的字符。"}】,看来特殊字符“\u001f”就是这个原因导致的了。
解决办法:
由于返回的是数据集,再加上使用linq获取数据时一些函数无法使用,便出此下策:获取数据后遍历替换特殊字符。
网上找了很多都没用,goole 了一篇文章 https://www.thinbug.com/q/6728329,一句代码解决问题。
重点是这一句:item.Vocation.Replace((char)(0x1F), ' ');
foreach(var item in data)
{
if (!string.IsNullOrEmpty(item.Vocation))
{
if (item.Vocation.IndexOf((char)(0x1F)) >= 0)
{
item.Vocation= item.Vocation.Replace((char)(0x1F), ' ');
}
}
}
后记:
1、软件开发时一定要控制输入,验证数据的有效性,避免以后踩坑。
2、经过查找发现“\u001f”在数据库中为 “-”,当“-”和中文在一起时linq查询数据时将“-”转为“\u001f”,原因还没查到。
3、既然已经知道是哪个字符搞的鬼了综合 后记 2 可以直接在linq中这么写,效率直接提升一大截。为什么一开始没想到呢
var result = from pers in db.DA_PersBasicInfo
join dept in db.DA_Department
on pers.DeptID equals dept.DeptID into u
from uc in u.DefaultIfEmpty()
where 1 == 1
select new PersDeptModel
{
PerName= pers.A0100,
IDCard= pers.A0101,
Vocation= pers.Vocation.Replace("\u001f", ""),
Sex= pers.Sex,
DeptName = uc.DeptName,
Spell = pers.Spell,
DeptID = pers.DeptID
};