zoukankan      html  css  js  c++  java
  • C#中序列化和反序列化

    1. 简介
    对象序列化是将对象(比如Person对象)转换为二进制数据
    反序列化是将二进制数据还原为对象。
    对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化。就像用DV录像(序列化)和用播放器播放(反序列化)一样。

    BinaryFormatter类有两个方法:

    void Serialize(Stream stream, object graph)  对象graph序列化到stream中
    object Deserialize(Stream stream)            将对象从stream中反序列化,返回值为反序列化得到的对象

    序列化:

    BinaryForatter bf = new BinaryForatter();
    using(Stream stream = File.OpenWrite(@"C:\1.dat"))
    {
        bf.Serialize(stream, obj);
    }

    反序列化

    using(Stream stream = File.OpenRead(@“C:\1.dat”))
    {
        object obj = bf.Deserialize(stream);
    }


    不是所有对象都能序列化,只有可序列化的对象才能序列化,在类声明上添加[Serializable],对象的属性、字段的类型也必须可序列化。
    反序列的项目中必须有同样的类,否则不能反序列化。

    2. 序列化的应用:
    ASP.Net、ViewState、WCF、.Net Remoting、ASP.Net Cache 、集群等。

    扩展阅读:
    (1)http://www.yaosansi.com/post/1061.html  
    (2)http://blog.sina.com.cn/s/blog_645752e60100h4w9.html

    3. 面试题
    深度拷贝。浅层拷贝。先手写浅层拷贝、深层拷贝的代码,理解了概念再谈用MemberwiseClone 、DeepCopy。见备注
    写代码拷贝,实现ICloneable方法,内部调用MemberwiseClone  

            static object DeepCopy(object src)
            {
                BinaryFormatter Formatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
                using (MemoryStream stream = new MemoryStream())
                {
                    Formatter.Serialize(stream, src);
                    stream.Position = 0;
                    return Formatter.Deserialize(stream);
                }
            }
    

      

    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/03/17/4576176.html

    本博客(liqipeng)除非已明确说明转载,否则皆为liqipeng原创或者整理,转载请保留此链接:https://www.cnblogs.com/liqipeng/archive/2013/03/17/4576176.html
    如果你觉得这篇文章对你有帮助或者使你有所启发,请点击右下角的推荐按钮,谢谢,:)
  • 相关阅读:
    如何在 Linux 中更改 swappiness
    logrotate机制&原理
    Linux命令 – ln 软连接与硬链接区别介绍
    Python实现目录文件的全量和增量备份
    tr -d命令删除与字符无关的符号
    CentOS7搭建时间服务器-chrony
    linux(centos7.0以上版本)安装 mysql-5.7.24-linux-glibc2.12-x86_64.tar 版本的mysql
    运维相关指标数据采集并ES入仓
    Kubernetes容器集群管理环境
    C++调用IDL程序的做法(三)
  • 原文地址:https://www.cnblogs.com/liqipeng/p/4576176.html
Copyright © 2011-2022 走看看