zoukankan      html  css  js  c++  java
  • 【12】对象序列化(二进制)

    1.简介

    对象序列化是将对象转换为二进制数据(字节流),反序列化是将二进制数据还原为对象。对象是稍纵即逝的,不仅程序重启、操作系统重启会造成对象的消失,就是退出函数范围等都可能造成对象的消失,序列化/反序列化就是为了保持对象的持久化

    BinaryFormatter类有两个方法:

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

    2.对象序列化的一些注意事项

    • 要序列化的类型必须标记为:[Serializable]
    • 该类型的父类也必须标记为: [Serializable]
    • 该类型中的所有成员的类型也必须标记为: [Serializable]
    • 序列化只会对类中的字段序列化,(只能序列化一些状态信息)
    • 类结构修改后之前序列化的内容尽量不要用了,否则可能会出错;

    3.为什么要序列化?
    保持对象的持久化,将一个复杂的对象转换流,方便我们的存储与信息交换
    应用:ASP.net中进程外Session要求对象可序列化;
    还有Xml序列化,应用开发中Json序列化已经代替了二进制序列化和Xml序列化等
    面试题:类可序列化的条件是?
    答:这个类必须标记为Serializable,如果这个类有父类,那父类也必须要编辑为Serialzable类型的,如果这类所有成员的也必须要编辑为Serializable。

    4.案例

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data.SqlClient;
    using System.IO;
    using System.Linq;
    using System.Reflection;
    using System.Runtime.Serialization.Formatters.Binary;//序列化需要引用的程序集
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    namespace TestConsole
    {
        delegate void MyDel();
        class Program
        {
    
            static void Main(string[] args)
            {
                Person p = new Person();
                p.Age = 12;
                p.Name = "蛋蛋";
                BinaryFormatter bf = new BinaryFormatter();
                //using (Stream stream = new FileStream(@"f:1.data", FileMode.Create))
                //{
                //    bf.Serialize(stream, p);//序列化
                //}
                Console.WriteLine("对象二进制序列化成功!");
                using (Stream stream = new FileStream(@"f:1.data", FileMode.Open))
                {
                    Person dP = (Person)bf.Deserialize(stream);//方序列化(当类结构变了后就尽量不要在使用这个对象,避免带来不必要的麻烦)
                    Console.WriteLine("Age=" + dP.Age + ",Name=" + dP.Name);
                }
    
                Console.ReadKey();
            }
        }
        [Serializable]
        class Person
        {
            public int Age { get; set; }
            public string Name { get; set; }
            private DanDan DanDan { get; set; }//这个属性的类型也要标记为Serializable
        }
        [Serializable]
        class DanDan
        {
            public string Id { get; set; }
        }
    }
  • 相关阅读:
    关于安卓9patch图片的探究
    android中系统时间
    android中的对话框
    swing界面刷新问题
    android中的xml解析全解
    android中listView下拉刷新
    次小生成树(poj 1679)
    poj 2312(bfs+priority_queue)
    poj 2060(最小路径覆盖)
    poj 1734 (最小环)
  • 原文地址:https://www.cnblogs.com/lolitagis02/p/8215431.html
Copyright © 2011-2022 走看看