C#中序列化存储和传输及反序列化对象

 最近需要写一个存储对象和加载对象的对象序列化功能.

记录一下这个这个过程:

首先是有个要被序列化存储的对象:

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();
            }

   }

}

这样就可以调用前面的两个序列化函数实现对象的序列化存储了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值