码迷,mamicode.com
首页 > 其他好文 > 详细

序列化之Serialize

时间:2015-08-29 20:17:18      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:序列化

简单介绍

序列化,就是转换格式,将一个String,或者一个对象,或者一个List,转换成流的形式,文本流(XML、TXT、Dat……)或者是二进制流,在转换回去就是反序列化。

  • XML和二进制流是最常见的,频繁序列化使用的。
  • 我在项目中使用它的好处:
    -1.在数据库中,假如我序列化一个对象,在表中只占一个字段。
    -2.存储文件到本地的时候,我序列化xml,再次打开程序读取xml即可得到我保存的数据。
    -3.一些信息的录入,例如软件的使用有一些格式需要用户来填写,只需要告诉他特定的格式写入数据即可。

方法

1.对象与字节数组

1.对象序列化为字节数组

简述

这就是转换为二进制流。

条件

(1)对象所属类加上标志[Serializable],在属性前加入标志 [XmlAttribute](加一个即可)
如图:
技术分享
(2)需要有一个常规的构造

Code

static byte[] ObjectSerializerByte<T>(T obj)
{
    var stream = new MemoryStream();
    var binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(stream, obj);
    return stream.GetBuffer();
}

2.对象序列化为字节数组

第二种方法

byte[] CatalogSerializerBinaryToStream<T>(T obj)
{

    Stream stream = new MemoryStream();
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    binaryFormatter.Serialize(stream, obj);

    BinaryReader binary = new BinaryReader(stream);
    binary.BaseStream.Seek(0, SeekOrigin.Begin);

    byte[] fileBytes = new byte[stream.Length];
    fileBytes = binary.ReadBytes((int)binary.BaseStream.Length);

    stream.Close();
    return fileBytes;
}

3.字节数组反序列化为对象

public static T ByteDeserializerCatalog<T>(byte[] binaryBytes)
{
    var bfBinaryFormatter = new BinaryFormatter();
    return (T)bfBinaryFormatter.Deserialize(new MemoryStream(binaryBytes));
}

2.对象与XML、Txt等文本格式

1.对象序列化为XML……存入到本地

我这个方法封装的,第4个参数很少用过,如果是null,新建文本,如果是apend,在传入路径打开的文本中添加内容,续写

/// <summary>
/// 对象序列化为XML、Txt等文本格式
/// </summary>
/// <typeparam name="T">对象类型</typeparam>
/// <param name="localPath">本地路径</param>
/// <param name="fileType">文件类型(xml\txt)</param>
/// <param name="fileModel">打开文件的方式(null直接create||append本地若存在在文件尾添加)</param>
/// 在append中可以延伸更改编码方式
void CatalogSerializerXmlToLocal<T>(T obj, string localPath, string fileType, string fileModel)
{
     XmlSerializer serializer = new XmlSerializer(typeof(T));
     TextWriter writer = null;
     switch (fileModel)
     {
         case null: { writer = new StreamWriter(localPath + "." + fileType); break; }
         case "append":
             {
                 FileStream stream = new FileStream(localPath + "." + fileType, FileMode.Append);
                 writer = new StreamWriter(stream);
                 break;
             }
     }

     if (null != writer )
     {
         serializer.Serialize(writer, obj);
         writer.Close();
     }
}

2.本地文件反序列化为对象

T XmlDeserializerCatalog<T>(T obj, string localPath)
{
    XmlSerializer serializer = new XmlSerializer(obj.GetType());
    FileStream stream = new FileStream(localPath, FileMode.Open);
    obj = (T)serializer.Deserialize(stream);
    stream.Close();
    return obj;
}

3.字节数组与XML

private XmlDocument RootDataBaseInStreamDeserializationBecomeXml(byte[] strBytes)
{
    XmlSerializer ser = new XmlSerializer(typeof(XmlDocument));
    MemoryStream memory = new MemoryStream(strBytes);
    XmlDocument xmlDocument = (XmlDocument)ser.Deserialize(memory);
    return xmlDocument;
}

4.字节数组与List< T >

1.List< T >序列化为字节数组

byte[] ListaySerializeByte<T>(List<T> obj)
{
    var bf = new BinaryFormatter();
    var ms = new MemoryStream();
    bf.Serialize(ms, PipeRangeGeometrys);
    return ms.ToArray();
}

2.字节数组反序列化为List< T >

object BytesDeserializeObject(byte[] arrBytes)
{
    var memStream = new MemoryStream();
    var binForm = new BinaryFormatter();
    memStream.Write(arrBytes, 0, arrBytes.Length);
    memStream.Seek(0, SeekOrigin.Begin);
    var obj = (Object)binForm.Deserialize(memStream);
    return obj;
}

return的强转为List< T >即可

5.List< T >与XML

List< T >与XML,附带String,将List< T >序列化为XML,然后转为String……,在转回List< T >

1.List< T >序列化为XML转为String

  var ser = new XmlSerializer(typeof(List< T >));
  var sb = new StringBuilder();
  var sw = new StringWriter(sb);
  ser.Serialize(sw, entList);//entList是要转换的
  string entListToString = sb.ToString();

2.XML转的String反序列化为List< T >

    var sr = new StringReader(str);//str是要转换的
    var ser = new XmlSerializer(typeof(List<string>));
    List<string> list = (List<string>) ser.Deserialize(sr);

结尾

一些是从项目中摘取,一些是没有用到但自己没事总结,但都是亲测过的,部分方法名字起的不够恰当~~

版权声明:本文为博主原创文章,未经博主允许不得转载。

序列化之Serialize

标签:序列化

原文地址:http://blog.csdn.net/panpen120/article/details/48081075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!