红色壁虎(三磊)

Red Gecko 石子虽平凡,聚少亦成多。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

简单对象的序列化与反序列化

Posted on 2010-09-03 16:55  红色壁虎  阅读(705)  评论(4编辑  收藏  举报

代码如下。部分借鉴网络资源。

代码虽然少,但是花费了老长一段时间。

 

写这个类的起由是 一个网络接口 开始的。这个接口

是,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;
        }
}

 

以上注释处有个 折腾我好久的东西"一个编码是65279的小空格" 这个空格大小估计也就1像素到2像素。不知道为什么在这里会冒出来。但就因为这个空格。在把转化出来的xml字符串,再次转化为对象时,总报异常。

 

根级别上的数据无效。 行 1,位置 1。

最后在调式时,无意间发现了这么个空格。

不知道这个空格有什么用。。。。。。