C# 中的序列化与反序列化
2011-04-25 12:33 音乐让我说 阅读(459) 评论(0) 编辑 收藏 举报Demo1
using System; using System.IO; using System.Xml.Serialization; /* 重点:由于Serializable标记了[AttributeUsage(Inherited = false)],那么被它标记的类A也就有了可以被序列化的能力,但继承自类A的类如果不加[Serializable],也就没有序列化的能力。 参考资料:http://www.cnblogs.com/qqflying/archive/2008/01/13/1037262.html */ namespace WebUI { public partial class TestSerializable : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { if (!IsPostBack) { Person s = new Person() { ID = 1001, Name = "张三" , Age = 18 }; FileStream fsToWrite = new FileStream(Server.MapPath( "~/被序列化的对象.xml" /* 或者是txt文件 */ ), FileMode.Create, FileAccess.Write); //BinaryFormatter bfToWrite = new BinaryFormatter(); //bfToWrite.Serialize(fsToWrite, s); //或者使用XML序列化,且它还不需要标记Serializable ,但是它不能序列化 IList<Person> XmlSerializer xs = new XmlSerializer( typeof (Person)); xs.Serialize(fsToWrite, s); fsToWrite.Dispose(); fsToWrite.Close(); this .ltMessage.Text = "序列化成功!" ; } } protected void btnGetDataFromSerialization_Click( object sender, EventArgs e) { FileStream fsToRead = new FileStream(Server.MapPath( "~/被序列化的对象.xml" /* 或者是txt文件 */ ), FileMode.Open, FileAccess.Read, FileShare.Read); //BinaryFormatter bfToRead = new BinaryFormatter(); //Person s = (Person)bfToRead.Deserialize(fsToRead); XmlSerializer xs = new XmlSerializer( typeof (Person)); Person s = (Person)xs.Deserialize(fsToRead); fsToRead.Dispose(); fsToRead.Close(); this .ltMessage.Text = "反序列化后,得到的姓名为:" + s.Name + ",ID:" + s.ID + ",年龄:" + s.Age; } } [Serializable] public class Person { public int ID { get ; set ; } public string Name { get ; set ; } [NonSerialized] private int _age; public int Age { get { return _age; } set { _age = value; } } } public class Student : Person { } } |
Demo2
using System; using System.Web; using System.Reflection; namespace WebUI { public partial class TestSerializable2 : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { if (!IsPostBack) { PeopleInHunan hunan = new PeopleInHunan(); Type tpHunan = hunan.GetType(); MethodInfo mi = tpHunan.GetMethod( "Introduction" ); if (mi != null ) { object [] cnObjs = mi.GetCustomAttributes( typeof (ChineseNameAttribute), true ); if (cnObjs.Length > 0) { ChineseNameAttribute cn = (ChineseNameAttribute)cnObjs[0]; Response.Write( "存在特性!" ); } else { Response.Write( "不存在特性!" ); } } else { Response.Write( "Introduction方法不存在!" ); } //测试的时候试试把ChineseNameAttribute标记的属性Inherited = false } } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false , Inherited = true )] public class ChineseNameAttribute : Attribute { public ChineseNameAttribute() { HttpContext.Current.Response.Write( "LoginFilterAttribute的无参构造函数初始化完成!" ); } public ChineseNameAttribute( string name) { Name = name; HttpContext.Current.Response.Write( "LoginFilterAttribute的有参构造函数初始化完成!姓名:" + name); } public string Name { get ; set ; } } public class Chinese { public Chinese( string name) { Name = name; } public string Name { get ; set ; } [ChineseName] public virtual void Introduction() { HttpContext.Current.Response.Write( "我的中文名字叫:" + Name); } [ChineseName( "刘德华" )] public virtual void SayHello( string name) { HttpContext.Current.Response.Write(name + ",您吃饭了吗?" ); } } public class PeopleInHunan : Chinese { public PeopleInHunan() : base ( "湖南人" ) { } public override void Introduction() { HttpContext.Current.Response.Write( "我的湖南名字叫:" + Name); } } } |
Demo3
using System; using System.Web; using System.Reflection; namespace WebUI { public partial class TestSerializable3 : System.Web.UI.Page { protected void Page_Load( object sender, EventArgs e) { if (!IsPostBack) { PeopleInHunan hunan = new PeopleInHunan(); Type tpHunan = hunan.GetType(); Object[] attrs = tpHunan.GetCustomAttributes( typeof (ChineseNameAttribute), true ); if (attrs != null && attrs.Length > 0) { ChineseNameAttribute cn = (ChineseNameAttribute)attrs[0]; Response.Write( "存在特性!Name:" + cn.Name); } else { Response.Write( "不存在特性!" ); } //测试的时候试试把ChineseNameAttribute标记的属性Inherited = false } } } [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false , Inherited = true )] public class ChineseNameAttribute : Attribute { public ChineseNameAttribute() { HttpContext.Current.Response.Write( "LoginFilterAttribute的无参构造函数初始化完成!" ); } public ChineseNameAttribute( string name) { Name = name; HttpContext.Current.Response.Write( "LoginFilterAttribute的有参构造函数初始化完成!姓名:" + name); } public string Name { get ; set ; } } [ChineseName(Name = "中国人" )] public class Chinese { public Chinese( string name) { Name = name; } public string Name { get ; set ; } [ChineseName] public virtual void Introduction() { HttpContext.Current.Response.Write( "我的中文名字叫:" + Name); } [ChineseNameAttribute( "刘德华" )] public virtual void SayHello( string name) { HttpContext.Current.Response.Write(name + ",您吃饭了吗?" ); } } public class PeopleInHunan : Chinese { public PeopleInHunan() : base ( "湖南人" ) { } } } |
我的后一篇:http://www.cnblogs.com/Music/archive/2012/06/14/about-c-sharp-serialize-and-deserialize-2.html
谢谢浏览!
作者:音乐让我说(音乐让我说 - 博客园)
出处:http://music.cnblogs.com/
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步