整理一下 .net 对象序列化注意事项:
1. 字段:必须是 public类型
2.属性:只读或者只写的属性不被序列化,只有 可读可写并且赋值的才可以
序列化:
Someclass obj = new SomeClass();
XmlSerializer ser = new XmlSerializer(typeof(Someclass));
StreamWriter writer = new StreamWriter("ser.xml");
ser.Serialize(writer, obj);
writer.Close();
反序列化
FileStream fs = new FileStream("ser.xml", FileMode.Open);
Someclass newObj = (Someclass)ser.Deserialize(fs);
fs.Close();
对于数组亦可,只需将SomeClass换成SomeClass[]即可。
关于在WCF中的序列化
json:DataContractJsonSerializer支持使用以JavaScript 对象标记作为序列化格式
using
System.Runtime.Serialization.Json;
Employee e = new Employee(101, "Daniel", "Dong"); FileStream writer = new FileStream("sample.xml", FileMode.Create); DataContractJsonSerilizer ser = new DataContractJsonSerilizer(typeof(Employee)); ser.Serialize(writer, e); writer.Close();
序列化Employee类的结果
{"Employee":101, "FirstName":"Daniel", "LastName":"Dong"}
xml: 主要讲两种
DataContractSerializer(作为默认的序列化基础方法因为它是WCF的初始序列化结构)、
XmlSerializer(如果你需要支持已有的类型或者自定义序列化而且它们不被DataContractSerializer支持的话,你可能想要使用XmlSerializer.)
Demo: xmlSerializer
using System.Xml.Serialization;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; using System.Xml.Serialization; using System.Diagnostics; namespace Chinaer.WcfDemo.ConsoleClient { class Program { static void Main(string[] args) { Person person = new Person() { Age = 12, UserPwd = "21", UserName = "郭志奇", Date = DateTime.Now }; using (XmlWriter writer = new XmlTextWriter("person.xml", Encoding.UTF8)) { XmlSerializer serializer = new XmlSerializer(typeof(Person)); serializer.Serialize(writer, person); } Process.Start("person.xml"); Console.Read(); } ////// 序列化方法 /// ////// /// public static void Serialize (T instace, string fileName) { using (XmlWriter writer = new XmlTextWriter(fileName, Encoding.UTF8)) { XmlSerializer serializer = new XmlSerializer(typeof(T)); serializer.Serialize(writer, instace); } Process.Start(fileName); } } [XmlRoot(ElementName="guozhiqi",Namespace="http://www.guozhiqi.com")] /// /// 定义一个实体类 Person /// public class Person { private Guid _id; private DateTime _date; //注意我们没有默认的构造函数 internal double Age { get; set; } //私有字段 年龄 ////// 通过XmlAttributeAttribute 序列化成xml属性 /// [XmlAttribute(AttributeName="GuidID",Namespace="http://guidID")] public Guid ID { get { return _id; } set { _id = value; } } //公有的随机数 [XmlElement(ElementName="DateTime",Namespace="http://date")] public DateTime Date { set { _date = value; } get { return _date; } } public string UserName { get; set; } public string UserPwd { get; set; } public Person() { } public Person(double age, Guid id) { this.Age = age; } } }
序列化结果:
2013-03-21T23:31:13.8584896+08:00 郭志奇 21
注意:xmlSerializer,对字段、属性序列化 遵循.net 序列化规则,字段是public,属性是可读可写,并且我们还也可以指定名称及命名空间
参考:
tks: