代码如下。部分借鉴网络资源。
代码虽然少,但是花费了老长一段时间。
写这个类的起由是 一个网络接口 开始的。这个接口
是,net webservice 开发,通过xml格式使用SOAP传递数据,简单,方便。在拿到文档和demo之前,我对此深感安慰,因为之前做过几个从按规则字符串拼凑的接口获取数据,实在差点是要我一条老命,这次听说来了个webservice,心想总算不用整天盯着字符串了。
当我拿到网络地址 就直接上项目,引用 web服务。然后开始尝试调用接口函数。怎么找都只找到只有一个string参数的方法,因为我要传输和获取的数据,参数都在10个字段以上。心里纳闷,赶紧去翻文档,然后去翻demo。。。终于在demo里,找到正解:所谓的xml传输数据,原来只是一个xml格式的string。
当时的心情就不详说了,2个字 泪奔。
那没办法,照旧开始把字符串转化为一个类,然后写方法,提供外部调用。虽然是字符串,但怎么说还是长的xml样,那就把他当xml文档处理吧,于是有了以下代码:
代码
public class XmlObjConvert
{
/// <summary>
/// 从对象转化为xml字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeXml(object obj)
{
string xml = string.Empty;
XmlSerializer xs = new XmlSerializer(obj.GetType());
XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8
};
MemoryStream stream = new MemoryStream();//如果用StringBuilder,转化出来的xml 编码是UTF16,XmlWriterSettings不起作用,. 只能对Stream进行编码更改。
using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
xs.Serialize(writer, obj);
}
return Encoding.UTF8.GetString(stream.ToArray()).Trim();//此处转化为xml字符串后,会有一个编码是65279的小空格,大约只占1个像素.
}
/// <summary>
/// 从xml转化为对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T DeserializeXml<T>(string xml) where T : class
{
if (xml == null || xml == string.Empty)
{
return default(T);
}
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlTextReader xtr = new XmlTextReader(new StringReader(xml));
object obj = xs.Deserialize(xtr);
return obj as T;
}
}
{
/// <summary>
/// 从对象转化为xml字符串
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static string SerializeXml(object obj)
{
string xml = string.Empty;
XmlSerializer xs = new XmlSerializer(obj.GetType());
XmlWriterSettings settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF8
};
MemoryStream stream = new MemoryStream();//如果用StringBuilder,转化出来的xml 编码是UTF16,XmlWriterSettings不起作用,. 只能对Stream进行编码更改。
using (XmlWriter writer = XmlWriter.Create(stream, settings))
{
xs.Serialize(writer, obj);
}
return Encoding.UTF8.GetString(stream.ToArray()).Trim();//此处转化为xml字符串后,会有一个编码是65279的小空格,大约只占1个像素.
}
/// <summary>
/// 从xml转化为对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="xml"></param>
/// <returns></returns>
public static T DeserializeXml<T>(string xml) where T : class
{
if (xml == null || xml == string.Empty)
{
return default(T);
}
XmlSerializer xs = new XmlSerializer(typeof(T));
XmlTextReader xtr = new XmlTextReader(new StringReader(xml));
object obj = xs.Deserialize(xtr);
return obj as T;
}
}
以上注释处有个 折腾我好久的东西"一个编码是65279的小空格" 这个空格大小估计也就1像素到2像素。不知道为什么在这里会冒出来。但就因为这个空格。在把转化出来的xml字符串,再次转化为对象时,总报异常。
根级别上的数据无效。 行 1,位置 1。
最后在调式时,无意间发现了这么个空格。
不知道这个空格有什么用。。。。。。