java泛型 序列化_泛型集合的序列化和反序列化

1.泛型集合的序列化比较简单,和普通对象没有两样,但是.net FrameWork里面没有提供现成的API,这是一个我自己封装的一个方法,采用了object作为被序列化对象的参数类型,亦即可以接受任意类型的对象,并通过调用GetType方法获得被序列化对象的转换前的类型(或者说是被序列化对象的真正类型,object在c#里是所有对象的基类),牺牲了一点点类型转换带来的性能损失,但是带来了很好的封装性,易用性。我简单了做了个对比测试,写了一个以具体类型作为参数的序列化方法,(方法内代码一模一样),序列化一个简单对象,重复执行1万次,相差大概10毫秒级,只要你对性能要求不是特别苛刻,我觉得都适合采用。

///

///序列化成xml字符串

///

///

///序列化后的字符串

publicstringSerialize(objectobj)

{

XmlSerializerxs =newXmlSerializer(obj.GetType());

using(MemoryStreamms =newMemoryStream())

{

System.Xml.XmlTextWriterxtw =newSystem.Xml.XmlTextWriter(ms, System.Text.Encoding.UTF8);

xtw.Formatting = System.Xml.Formatting.Indented;

xs.Serialize(xtw, obj);

ms.Seek(0,SeekOrigin.Begin);

using(StreamReadersr =newStreamReader(ms))

{

stringstr = sr.ReadToEnd();

xtw.Close();

ms.Close();

returnstr;

}

}

}

调用代码举例如下:

publicclassclassA

{

publicstringname {get;set; }

publicstringaddress {get;set; }

}

List list =newList() {newclassA() { name ="1", address ="2"},newclassA{ name ="2", address ="3"} };

strings = Serialize(list);

s = Serialize(newclassA() { name ="1", address ="2"});

2.现在重点来说说集合对象的反序列化。翻遍了MSDN上关于序列化和反序列化的文章,都是长篇大论教你怎么序列化和反序列化一个对象,唯独没有讨论怎么序列化和反序列化集合对象的,

更别提泛型集合了。当我在xml文件里直接录入两个结构一模一样的节点时,IDE智能感应提示我xml文件里必须有而且是唯一的一个根节点,也就是说,如果你想反序列化一个对象数组,

如classA[],你还必须得在xml文件里最外层节点套一个像这样的根节点,反序列化以后得到root对象,通过读取这个root对象的属性才能得到这个对象数组,

有没有直接一点的办法呢?于是我调用前面写好的序列化方法,把一个集合对象序列化成字符串,得到的字符串形式如下..… ArrayOfClassA>,

看到这里,相信聪明的读者也领悟到了,只要往xml文件按这种格式编写,把root替换成ArrayOfClassA(注意这里classA首字母变成大写了),反序列化时候就能直接得到classA[],对于List也一样。所以,xml文件编写格式举例如下:

111

222

2111

1222

.net FrameWork里既有对xml字符串的反序列化方法,也有对xml文件的反序列化方法,对比了一下代码,无非就是流读取对象不一样,一个是StringReader,StreamReader,而他们都继承于TextReader,我干脆把它们都集合为一个方法。反序列化的封装方法如下:

///

///反序列化方法

///

///xml字符串

///反序列化对象的类型

///反序列化后的对象

publicobjectDesrialize(stringxml,Typetype)

{

objectobj =null;

XmlSerializerxs =newXmlSerializer(type);

TextReadertr;

if(!File.Exists(xml))

{

tr =newStringReader(xml);

}

else

{

tr =newStreamReader(xml);

}

using(tr)

{

obj = xs.Deserialize(tr);

}

returnobj;

}

调用代码如下

List list = Desrialize("xxx.xml",typeof(List))asList;

当然也可反序列化单个对象

classAitem = Desrialize("xxx.xml",typeof(classA))asclassA;

然而,这里还是觉得不够完美,因为泛型没用上啊:

///

///反序列化方法

///

///反序列化对象类型

///反序列化字符串或者xml文件路径

///

publicT Desrialize(stringxml)

{

T obj =default(T);

XmlSerializerxs =newXmlSerializer(typeof(T));

TextReadertr;

if(!File.Exists(xml))

{

tr =newStringReader(xml);

}

else

{

tr =newStreamReader(xml);

}

using(tr)

{

obj = (T)xs.Deserialize(tr);

}

returnobj;

}

调用代码如下

List list = Desrialize>("xxx.xml");

当然也可反序列化单个对象

classAitem = Desrialize("xxx.xml");

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值