谈谈:.Net中的序列化和反序列化

序列化和反序列化相信大家都经常听到,也都会用, 然而有些人可能不知道:.net为什么要有这个东西以及.net Frameword如何为我们实现这样的机制, 在这里我也是简单谈谈我对序列化和反序列化的一些理解。

一、什么序列化和反序列化

序列化通俗地讲就是将一个对象转换成一个字节流的过程,这样就可以轻松保存在磁盘文件或数据库中。反序列化是序列化的逆过程,就是将一个字节流转换回原来的对象的过程。

然而为什么需要序列化和反序列化这样的机制呢?这个问题也就涉及到序列化和反序列化的用途了,

对于序列化的主要用途有:

  • 将应用程序的状态保存在一个磁盘文件或数据库中,并在应用程序下次运行时恢复状态。例如, Asp.net 中利用序列化和反序列化来保存和恢复会话状态。
  • 一组对象可以轻松复制到Windows 窗体的剪贴板中,再粘贴回同一个或者另一个应用程序。
  • 将对象按值从一个应用程序域中发送到另一个程序域

并且如果把对象序列化成内存中的字节流,就可以利用一些其他的技术来处理数据,例如,对数据进行加密和压缩等。

二、序列化和反序列简单使用

.Net Framework 提供二种序列化方式:

  • 二进制序列化
  • XML 和SOAP序列化

序列化和反序列化的简单使用:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Serializable
{
  [Serializable]
  public class Person
  {
    public string personName;

    [NonSerialized]
    public string personHeight;
    private int personAge;

    public int PersonAge

    {
      get { return personAge; }
      set { personAge = value; }
    }

    public void Write()
    {
      Console.WriteLine("Person Name: "+personName);
      Console.WriteLine("Person Height: " +personHeight);
      Console.WriteLine("Person Age: "+ personAge);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Person person = new Person();
      person.personName = "Jerry";
      person.personHeight = "175CM";
      person.PersonAge = 22;
      Stream stream = Serialize(person);

      //为了演示,都重置
      stream.Position = 0;
      person = null;

      person = Deserialize(stream);
      person.Write();
      Console.Read();
    }
    private static MemoryStream Serialize(Person person)
    {
      MemoryStream stream = new MemoryStream();
      // 构造二进制序列化格式器
      BinaryFormatter binaryFormatter = new BinaryFormatter();
      // 告诉序列化器将对象序列化到一个流中
      binaryFormatter.Serialize(stream, person);

      return stream;
    }

    private static Person Deserialize(Stream stream)
    {
      BinaryFormatter binaryFormatter = new BinaryFormatter();
      return (Person)binaryFormatter.Deserialize(stream);
    }
  }
}

主要是调用System.Runtime.Serialization.Formatters.Binary命名空间下的BinnaryFormatter类来进行序列化和反序列化,调用反序列化后的结果截图:

时间: 2024-12-08 09:42:04

谈谈:.Net中的序列化和反序列化的相关文章

C# 中的序列化和反序列化【转】

序列化就是将我们程序中的对象通过字节流写入存储媒体或网络流中. 反序列化就是把已存入的媒体或接收的网络流中的内容转换成程序运行中的对象. 这两个过程结合起来,可以轻松地存储和传输数据. 使用序列化场景: 1.在用户登录后,对界面作一些个性化设置(如:背景色.布局.字体等),为了使用户关闭网页后能够保留设置,以便在下次登录时再加载上次的设置.我们可以将用户的设置信息保存在一个对象中,然后把该对象序列化保存在表的某个字段中,在加载网页的时候取出字段中的信息,并反序列化生成设置对象,应用到用户界面上.

java中的序列化与反序列化,还包括将多个对象序列化到一个文件中

package Serialize; /** * Created by hu on 2015/11/7. *///实现序列化必须实现的接口,这就是一个空接口,起到标识的作用import java.io.Serializable; /** * 用来进行序列化和反序列化的类 * */public class person implements Serializable { private int age; private String name; private String sex; public

java中的序列化和反序列化学习笔记

需要序列化的Person类: package cn.itcast_07; import java.io.Serializable; /* * NotSerializableException:未序列化异常 * * 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实现此接口的类将无法使其任何状态序列化或反序列化. * 该接口居然没有任何方法,类似于这种没有方法的接口被称为标记接口. * * java.io.InvalidClassException: * cn.it

C#中JSON序列化和反序列化

json序列化和反序列化帮助类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Serialization; using System.Runtime.Serialization.Json; using System.IO; using System.Text.RegularExpressions; using System.We

Protobuf-net在Unity中的序列化与反序列化

本篇中我们只讲解如何在Unity中对Protobuf-net进行序列化(Serialize)与反序列化(Deserialize),关于Unity的socket(插座)网络通信部分我们后续开篇. 首先去Protobuf-net的Google下载点下载protobuf-net类库:https://code.google.com/p/protobuf-net/downloads/list这里用的是目前最新的protobuf-net r668下载完毕后打开压缩包,在Full\unity中找到protob

在Java中进行序列化和反序列化

对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象. 对象序列化允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上或者通过网络将这种二进制流传输到另外一个网络节点. 其他程序一旦获得了这种二进制流,都可以将这种二进制流恢复成原本的Java对象. 序列化的含义和意义 序列化机制允许将实现序列化的Java对象转换成字节序列,这些字节序列可以进行持久化或者通过网络传输,使得对象可以脱离程序的运行而独立存在. 序列化将一个Java对象写入IO流中.

python中的序列化和反序列化

~~~~~~滴滴,,什么是序列呢?可以理解为序列就是字符串.序列化的应用 写文件(数据传输) 网络传输 序列化和反序列化的概念   序列化模块:将原本的字典.列表等内容转换成一个字符串的过程就叫做序列化. 序列化:内存中的对象转换为字节序列(字符串) 反序列化:将字节序列转换为内存中的对象 序列化的目的:1.以某种存储形式是自定义对象持久化2.将对象从一个地方传递到另一个地方3.使程序更具有维护性 各种模块的特点和应用 1.json模块:通用的序列化格式 只有很少的一部分数据类型通过json转化

JDK中的序列化和反序列化

题外话:诸事缠身,不知不觉距离上一篇就将近一个月了,读书不易,学习不易,唯有坚持. 写来写去始终不满意,索性贴一个比较好的文章吧! 参考: [Java基础]序列化与反序列化深入分析

java中的序列化和反序列化

对象序列化是用于将对象状态转换为字节流的过程,可将其保存到磁盘文件中或通过网络发送到任何其他程序:从字节流创建对象的相反过程称为反序列化.而创建的字节流是与平台无关的,在一个平台序列化的对象可以再不同的平台上反序列化. 序列化是一个标记接口,意味着他不包含任何字段和方法,仅用于标识可序列化的语意. 实用场景:跨平台.跨域传输对象一般都需要将对象序列化.   一般我们会专门封装一个类去实现Serializable,用该类去进行传输 transient修饰符仅适用于变量,不适用于方法和类,如果我们不