xml序列化与反序列化 java_XML和实体序列化和反序列化

近来的项目中用到了序列化就抽空学习了一下,拿出来给大家分享一下:

类为我们提供了自己对象串行化(Serialize)和反串行化(Deserialize)的xml的方法,该类可以序列化的内容:

公共类的公共读写字段或者属性

XmlElement对象

XmlNode对象

Dataset对象

实现了Icollection 或IEnumerable的类

该类在设计中有一个设计需求:

需要被序列化的类要提供一个空参数的构造函数,否则运行时会出现异常

在开发过程中可能会有很多地方要用到对象和XML相互转化,在此提供一个通用的类,提供泛类型的支持。

///

/// 序列化帮助类

///

public class SHelper

{

///

/// 对象到XML-----泛类型

///

///

///

///

public static string SaveXmlFromObj(T obj)

{

if (obj == null) return null;

XmlSerializer serializer = new XmlSerializer(typeof(T));

MemoryStream stream = new MemoryStream();

XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);

xtw.Formatting = Formatting.Indented;

try

{

serializer.Serialize(stream, obj);

}

catch { return null; }

stream.Position = 0;

string returnStr = string.Empty;

using (StreamReader sr = new StreamReader(stream, Encoding.UTF8))

{

string line = "";

while ((line = sr.ReadLine()) != null)

{

returnStr += line;

}

}

return returnStr;

}

///

/// XML到反序列化到对象----支持泛类型

///

///

///

///

public static T LoadObjFromXML(string data)

{

using (MemoryStream stream = new MemoryStream())

{

using (StreamWriter sw = new StreamWriter(stream, Encoding.UTF8))

{

sw.Write(data);

sw.Flush();

stream.Seek(0, SeekOrigin.Begin);

XmlSerializer serializer = new XmlSerializer(typeof(T));

try

{

return ((T)serializer.Deserialize(stream));

}

catch { return default(T); }

}

}

}

}

该类提供两方法,一个是从实体到返回XML字符串的方法,一个是把XML字符串装成对象实体的方法。下面我们来看看这个类是怎么用的。

首先建两个类USer和Users,User测试一个实体的序列化和反序列化,USers测试一个List集合序列化和反序列化。注意这两个类都标注了[Serializable]特性,并且提供了空参数的构造函数。

8f900a89c6347c561fdf2122f13be562.png

[Serializable]publicclassUser

{publicintID { get; set; }publicstring Name { get; set; }publicstring Add { get; set; }publicintAge { get; set; }publicUser()

{this.ID=default(int);this.Name=default(string);this.Add=default(string);this.Age=default(int);

}

}

[Serializable]publicclassUsers

{publicListDatas {get;set; }publicUsers()

{this.Datas=newList();

}

}

下面我们建一个页面Default.aspx,在这个页面中我们测试序列化,提供两个按钮和两个TextBox,来分别显示单个实体的序列化和List集合的序列化。

8f900a89c6347c561fdf2122f13be562.png

后台代码的实现:

8f900a89c6347c561fdf2122f13be562.png

/// /// 一个对象序列化/// /// /// protectedvoidButton1_Click(object sender, EventArgs e)

{

User user=newUser() { ID=1001,Name="小王",Add="北京",Age=21};

var str=SHelper.SaveXmlFromObj(user);this.TextBox1.Text=str;

}/// /// 多个对象序列化/// /// /// protectedvoidButton2_Click(object sender, EventArgs e)

{

Users users=newUsers();

User user=newUser() { ID=1001, Name="小王", Add="北京", Age=21};

users.Datas.Add(user);

users.Datas.Add(user);

users.Datas.Add(user);

var str=SHelper.SaveXmlFromObj(users);this.TextBox2.Text=str;

}

序列化结果如下:

单对象:

<?xml version="1.0"?>1001小王北京21

List集合

8f900a89c6347c561fdf2122f13be562.png

<?xml version="1.0"?>1001小王北京211001小王北京211001小王北京21

下面我们来测试反序列化:

首先建一个webservice,写两个测试方法:

8f900a89c6347c561fdf2122f13be562.png

[WebMethod]publicstring GetObjFromXml(string data)

{

var obj=SHelper.LoadObjFromXML(data);if(obj!=null)

{returnobj.Name; }else{return"传入数据出错"; }

}

[WebMethod]publicstring GetObjsFromXml(string data)

{

var obj=SHelper.LoadObjFromXML(data);if(obj!=null)

{

string returnstr="";

foreach (User user in obj.Datas)

{

returnstr+=user.Name+"\n";

}returnreturnstr;

}else{return"传入数据出错"; }

}

编译后运行,我们用刚才序列化出来的字符串贴出参数值位置就可以测试反序列化的方法,在此不再详述,有兴趣的童鞋可以把实例代码运行。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值