记录一下这个这个过程:
首先是有个要被序列化存储的对象:
public class ObjModel{
public String Name{get;set; }public String Value{ get; set; }
}
需要在类声明上加上[Serializable]特性
[Serializable]
public class ObjModel{
public String Name{get;set; }
public String Value{ get; set; }
}
标识这个类可以被序列化和反序列化。
每个类都有个ToString方法,不要混淆这个tostring()。这个和序列化没有关系。他是把对象转换为String用于显示,而非序列化。
并不存在一个fromString来反序列化成一个对象的方法。当然可以自己写一个。
下面是使用Xml序列化对象的方法,当然java下可以用Json,等
xml序列化一个对象时,可以加一些特性(.net下叫法)java称为注解。
包括 [XmlRoot("classmame")]类前声明,[XmlAttribute("fieldname")]属性前声明。改变序列化时存入到xml中的元素名称。
/// <summary>
/// 序列化成字符串
/// </summary>
/// <param name="obj"></param>
/// <returns>序列化后的字符串</returns>
public static string Serialiaze(object obj)
{
XmlSerializer xs = new XmlSerializer(obj.GetType());
MemoryStream ms = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(ms, System.Text.Encoding.UTF8);
xtw.Formatting = Formatting.Indented;
xs.Serialize(xtw, obj);
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
string str = sr.ReadToEnd();
xtw.Close();
ms.Close();
return str;
}
/// <summary>
/// 反序列化 从字符串
/// </summary>
/// <param name="xml">xml字符串</param>
/// <param name="type">要生成的对象类型</param>
/// <returns>反序列化后的对象</returns>
public static object Deserialize(string xml, Type type)
{
XmlSerializer xs = new XmlSerializer(type);
StringReader sr = new StringReader(xml);
object obj = xs.Deserialize(sr);
return obj;
}
下面主要说一下如何重载序列化,已构造有个性的序列化存储。
例如如果某个属性是NULL,在xml节点中并不存储等等。
首先,为了实现序列化方法,需要继承 interface IXmlSerializable并实现这个接口
[Serializable]
public class ObjModel: System.Xml.Serialization.IXmlSerializable{
public String Name{get;set; }
public String Value{ get; set; }
public void ReadXml(System.Xml.XmlReader reader)
{
var element = XElement.Parse(reader.ReadOuterXml());
this.Name= element.Attribute("Name") != null ? element.Attribute("Name").Value : string.Empty;
this.Name= element.Attribute("Value") != null ? element.Attribute("Value").Value : string.Empty;
}
public void WriteXml(System.Xml.XmlReader reader)
{
if (!string.IsNullOrEmpty(this.Name))
{
writer.WriteStartAttribute("Name");
writer.WriteString(this.Name);
writer.WriteEndAttribute();
}
if (!string.IsNullOrEmpty(this.Value))
{
writer.WriteStartAttribute("Value");
writer.WriteString(this.Value);
writer.WriteEndAttribute();
}
}
}
这样就可以调用前面的两个序列化函数实现对象的序列化存储了。