序列化之Serialize

简单介绍

序列化,就是转换格式,将一个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);

结尾

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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值