序列化之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);

结尾

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

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

时间: 2024-10-04 16:06:13

序列化之Serialize的相关文章

php 序列化(serialize)格式详解

1.前言 PHP (从 PHP 3.05 开始)为保存对象提供了一组序列化和反序列化的函数:serialize.unserialize.不过在 PHP 手册中对这两个函数的说明仅限于如何使用,而对序列化结果的格式却没做任何说明.因此,这对在其他语言中实现 PHP 方式的序列化来说,就比较麻烦了.虽然以前也搜集了一些其他语言实现的 PHP 序列化的程序,不过这些实现都不完全,当序列化或反序列化一些比较复杂的对象时,就会出错了.于是我决定写一份关于 PHP 序列化格式详解的文档(也就是这一篇文档),

jQuery的序列化元素 serialize()方法 serializeArray()方法 param()方法

当提交的表单元素较多时用serialize()方法,serialize()方法也是作用于一个jQuery的对象,它能够将DOM元素内容序列化为字符串,用于Ajax请求. serialize() 方法通过序列化表单值,创建 URL 编码文本字符串. .serialize() 方法可以操作已选取个别表单元素的 jQuery 对象,比如 <input>, <textarea> 以及 <select>.不过,选择 <form> 标签本身进行序列化一般更容易些: $(

Redis 数据序列化方法 serialize, msgpack, json, hprose 比较

最近弄 Redis ,涉及数据序列化存储的问题,对比了:JSON, Serialize, Msgpack, Hprose 四种方式 1. 对序列化后的字符串长度对比: 测试代码: $arr = [0, 1, 2, 'a', 'b', 'c', 'd', 'a'=>'12', '包含中文', 'abcd包含中文efg'=>'abc一二三四defg', '键名'=>['abc'=>['def'=>123, 456, 'abcd中文内容efg'], 'a之间c'=>['a'=

ajax提交表单序列化(serialize())数据

知识点: $("#form").serialize();将表单数据序列化为标准URL编码文本字符串(key1=value1&key2=value2…). 以下用一个例子来演示ajax提交表单序列化数据. 表单内容: <form id="f1"> <label for="realname" >姓名:</label><input type="text" name="rea

对象的序列化与反序列化-serialize与unserialize

通俗的来说: 对象的序列化的基本概念: 所谓对象的序列化,就是可以把某个对象的属性名称,属性值, 属性类型,类名 以字符串的形式保存到文件中,在你需要的时候可以重新恢复. 对象的反序列化的基本概念, 是序列化的逆向过程. 函数: 序列化:serialize() string serialize ( mixed $value ) 手册上给的定义是:产生一个可存储的值的表示 其实就是在不丢失对象的结构和类型的情况下将一个对象转换成一个字符串,可以存储在任何地方 在 PHP 3 中,对象属性将被序列化

JSON格式化与serialize序列化

一.JSON格式化 1. JSON是什么 JSON是一种数据的存储格式,用来沟通客户端Javascript和服务端PHP的交互.我们把用PHP生成JSON后的字符串传给前台Javascript,Javascirpt就可以很容易的将其反JSON然后应用. 2. 如何使用JSON PHP操作JSON可以使用json_encode()和json_decode()两个函数——一个编码,一个解码.json_encode()可以将数组转换成json格式的文本数据,方便存储和读取,而json_decode()

【jQuery基础学习】05 jQuery与Ajax以及序列化

好吧,这章不像上章那么水了,总是炒剩饭也不好. 关于AJAX 所谓Ajax,全名Asynchronous JavaScript and XML.(也就异步的JS和XML) 简单点来讲就是不刷新页面来发送和获取数据,然后更新页面. Ajax的优势 无需插件支持 优秀的用户体验 提高web程序的性能 减轻服务器和带宽的负担 Ajax的不足 浏览器兼容不足 破坏浏览器前进和后退按钮的正常功能 对搜索引擎的支持不足 开发和调试工具的 缺乏 好吧,这些都是几年前的不足.技术的发展很快,这些不足也会慢慢弥补

C#学习日志 day8 -------------- async await 异步方法入门(引用博客)以及序列化和反序列化的XML及json实现

首先是异步方法的介绍,这里引用自http://www.cnblogs.com/LoveJenny/archive/2011/11/01/2230933.html async and await 简单的入门 如果有几个Uri,需要获取这些Uri的所有内容的长度之和,你会如何做? 很简单,使用WebClient一个一个的获取uri的内容长度,进行累加. 也就是说如果有5个Uri,请求的时间分别是:1s 2s 3s 4s 5s. 那么需要的时间是:1+2+3+4+5=(6*5)/2=15. 如果采用并

序列化 | 反序列化

<项目一: 序列化> 创建一个控制台应用程序,命名为"序列化" using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; using System