.NET进阶篇04-Serialize序列化、加密解密

知识需要不断积累、总结和沉淀,思考和写作是成长的催化剂
这篇很轻松,没有什么费脑子的,所以解析较少,代码较多,为数不多的拿来即用篇
整个章节分布请移步 .NET开篇总括

一、概述

序列化是把一个内存中的对象的信息转化成一个可以持久化保存(二进制数据)的形式,以便于保存或传输,序列化的主要作用是不同平台之间进行通信,常用的有序列化有json、xml、文件等,反序列化是将进制数据还原为对象,内存中的对象稍纵即逝,序列化反序列化就是为了保持对象的持久化。就像用DV录像,用播放器播放一样。

加密是通过对消息进行编码,建立一种安全的交流方式,使得只有你和你所期望的接收者能够理解。

二、序列化

1、二进制文件

内置的BinaryFormatter二进制序列化器用于将对象序列化和反序列化二进制文件。要引用System.Runtime.Serialization.Formatters.Binary。
假设我们有以下对象

[Serializable]  //必须添加序列化特性
public class Person
{
   
   [NonSerialized]
   public int Id = 1;
   public string Name {
    get; set; }
   public string Sex {
    get; set; }
}

创建一个BinaryFormatter实例,调用实例Serialize方法将对象写入文件流中

string fileName = Path.Combine("D:\\", @"BinarySerialize.txt");//文件名称与路径
using (Stream fStream = new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite))
{
   
    Person p = new Person() {
    Id = 1, Name = "jack", Sex = "男" };//对象
    BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
    binFormat.Serialize(fStream, p);
}

通过调用实例Deserialize方法把二进制文本反序列化为对象

using (Stream fStream = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite))
{
   
    BinaryFormatter binFormat = new BinaryFormatter();//创建二进制序列化器
    fStream.Position = 0;//重置流位置
    Person p = (Person)binFormat.Deserialize(fStream);//反序列化对象
}

但注意我们必须在类上面标记Serializable特性,才能序列化该对象,默认属性字段都可序列化了,当然我们通过标记NonSerialized可以要求某个字段不序列化,但这样反序列后该字段就会没有值(或默认值)

结合咱们前天学到的泛型,我们包装一下BinarySerializeHelper帮助类

 public class BinarySerializeHelper
 {
   

    /// <summary>
    /// 将对象序列化为字符串
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="t">实例</param>
    /// <returns>字符串</returns>
    public static string ObjectToString<T>(T t)
    {
   
        BinaryFormatter formatter = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream())
        {
   
            formatter.Serialize(stream, t);
            string result = System.Text.Encoding.UTF8.GetString(stream.ToArray());
            return result;
        }
    }

    /// <summary>
    /// 将对象序列化为文件
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="t">实例</param>
    /// <param name="path">存放路径</param>
    public static void ObjectToFile<T>(T t, string path)
    {
   
        BinaryFormatter formatter = new BinaryFormatter();
        using (FileStream stream = new FileStream(path, FileMode.OpenOrCreate))
        {
   
            formatter.Serialize(stream, t);
            stream.Flush();
        }
    }

    /// <summary>
    /// 将字符串反序列为类型
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="s">字符串</param>
    /// <returns>对象</returns>
    public static T StringToObject<T>(string s) where T : class
    {
   
        byte[] buffer = System.Text.Encoding.UTF8.GetBytes(s);
        BinaryFormatter formatter = new BinaryFormatter();
        using (MemoryStream stream = new MemoryStream(buffer))
        {
   
            T result = formatter.Deserialize(stream) as T;
            return result;
        }
    }

    /// <summary>
    /// 将文件反序列化为对象
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="path">路径</param>
    /// <returns>对象</returns>
    public static T FileToObject<T>(string path) 
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值