第8章 流和序列化

8.1 文件

8.1.1 不同视角下的文件

应用程序级,人类可阅读级,机器级

8.1.2 位,字节和字节数组

8.2 流

8.2.1 关于流的类比

8.2.2 使用流进行文件复制

1.一次性复制

2.循环分批复制

当打开或创建文件时,流指针默认位于文件头,当调用read或write方法后,流指针会自动向后移动相应的字节。因此在代码中无需设置,每次调用read或write时,读取的都是未处理的字节。

8.2.3 流的类型体系

1.基础流

从流中读取数据:canread;read;readbyte

向流中写入数据:canwrite;write;writebyte

移动流指针:canseek;seek;position;close;dispose;flush;

超时处理:cantimeout;readtimeout;writetimeout;

流长度:length;setlength

2.装饰器流

1)包含stream流基类的引用

2)没有后备存储概念

bufferedstream;deflatestream;gzipstream

3.包装器类

1)streamreader和streamwriter

2)binaryreader和binarywriter

4.帮助类

file静态类:open;openwrite;openread;readalltext;readallbytes;writeallbytes;writealllines;copy

fileinfo;path;directory;dicrectoryinfo

8.3 序列化

8.3.1 基本操作

IFormatter:serialize;deserialize

binaryformatter和soapformatter

默认情况下类型都是不可序列化的,需要明确指出[Serializable]特性(133)

序列化不光需要该类型是标记为Serializable,类型中的属性和字段也需要是可序列化的。如不需要序列化,用[NonSerialized]特性标记,该特性只能加在字段上,不能加在属性上(134)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Product product = new Product(188) { Price = 4998.5F, Name = "Lumia 920" };
            IFormatter formatter = new BinaryFormatter();
            Stream fs = File.OpenWrite(@"C:\Users\Administrator\Desktop\product.obj");
            formatter.Serialize(fs, product);
            fs.Dispose();
            Console.WriteLine(product);
            //IFormatter formatter = new BinaryFormatter();
            //Stream fs = File.OpenRead(@"C:\Users\Administrator\Desktop\product.obj");
            //Product product = (Product)formatter.Deserialize(fs);
            //fs.Dispose();
            //Console.WriteLine(product);
            Console.Read();
        }

        [Serializable]
        public class Product:IDeserializationCallback
        {
            private int id;
            public string Name { get; set; }
            public double Price { get; set; }
            [NonSerialized]
            private SqlConnection conn;
            public Product(int id)
            {
                this.id = id;
                conn = new SqlConnection(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=123");
            }
            public override string ToString()
            {
                return string.Format("id:{0},name:{1},price:{2},conn:{3}", this.id, this.Name, this.Price, this.conn == null ? "NULL" : "OBJECT");
            }

            public void OnDeserialization(object sender)
            {
                conn = new SqlConnection(@"Data Source=.;Initial Catalog=DB;User ID=sa;Password=123");
            }
        }
    }
}

8.3.2 事件响应

[OnSerializing]

[OnSerialized]

[OnDeserializing]

[OnDeserialized]

四个特性对应四个事件方法

8.3.3 自定义序列化过程

时间: 2024-11-06 07:30:02

第8章 流和序列化的相关文章

笔记:I/O流-对象序列化

Java 语言支持一种称为对象序列化(Object Serialization)的非常通用的机制,可以将任何对象写入到流中,并在之后将其读回,首先需要支持对象序列化的类,必须继承与 Serializable 接口,该接口没有任何方法,只是对类起到标记的作用,然后使用 ObjectOutputStream 流来序列化对象,使用 ObjectInputStream 流来反序列化,示例代码如下: 对象类声明: public class Employee implements Serializable

动车上的书摘-java对象流与序列化

动车上的书摘-java对象流与序列化 摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 钢笔不限贵便宜,书法是来自心对手的交流.-泥沙砖瓦浆木匠 一.对象序列化 当需要存储相同类型的数据,选择固定的长度记录是好选择.但是在面向对象(OOP)程序中,对象之间很少有全部相同的类型.所以,java语言支持一种称为对象序列化(object serialization)的机制. 下面展示一个序列化例子,关于两个对象 Em

[疯狂Java]I/O:I/O流的最高境界——对象流(序列化:手动序列化、自动序列化、引用序列化、版本)

1. 什么是对象流:序列化/反序列化的概念 1) 对象流是和字节流/字符流同处于一个概念体系的: a. 这么说字节流是流动的字节序列,字符流是流动的字符序列,那么对象流就是流动的对象序列咯? b. 概念上确实可以这样理解,对象流就是专门用来传输Java对象的: c. 但是字节和字符都是非常直观的二进制码(字节本身就是,而字符是一种二进制编码),二进制码的流动是符合计算机的概念模型的,可是对象是一个抽象的东西,对象怎么能像二进制码那样流动呢? d. 其实很好理解,对象流只不过是Java的API而已

转换流、序列化流、打印流、commons-io、properties

Java中传输最频繁是字符但是传输开始用的是字节流<不能看出传输的是啥>所以又有了字符流(底层为字节流); IO流的分类 |- 字节流 - 字节输入流 InputStream 抽象类 -  FileInputStream 操作文件的字节输入流 - 字节输出流 OuputStream抽象类 - FileOutputStream 操作文件的字节输出流 |- 字符流 - 字符输入流 Reader抽象类 - FileReader 用来操作文件的字符输入流(简便的流) - 字符输出流 Writer抽象类

java 21 - 13 IO流之序列化和反序列化

序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.对象 -- 流数据(ObjectOutputStream) 构造方法:ObjectInputStream(InputStream in)  创建从指定 InputStream 读取的 ObjectInputStream 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象.流数据 -- 对象(ObjectInputStream) 构造方法:ObjectInputStream(InputStream in)  创建从指定

io流和序列化

1.使用File操作文件 public class IoTest { public static void main(String[] args) throws IOException { /* 01.删除或者创建文件 * File file=new File("e:/io.txt"); addOrDel(file); */ File file=new File("e:/java/hello"); //file.mkdir(); 只能创建一层目录 file.mkdi

第24章 运行时序列化

什么是序列化和反序列化 序列化(serialization)是将一个对象或者对象图(对象在特定的时间点的一个视图)转换成一个字节流的过程.反序列化(deserialization)是将一个字节流转换回对象图的过程. 应用场景: 应用程序的状态(对象图)可以保存到磁盘文件或数据库中,并在应用程序下次运行时恢复. 一组对象可以轻松复制到Windows 窗体的剪贴板中,再粘贴回同一个或者另一个应用程序. 将对象按值从一个应用程序域中发送到另一个程序域 24.1 序列化/反序列化快速入门 http://

java对象流与序列化

Object流,直接把obj写入或读出. 前言: 比如 画图的程序,咣当画一个三角形出来,咣当画一正方形出来.然后存盘,当你下次再打开软件的时候三角形.方块还在原来的位置上.如果用面向对象的思维,三角形,方块都有自己的成员变量,x.y坐标.颜色.线的颜色.粗细等,你存盘的时候要把这些内容写到硬盘上,写到文件里,这叫存盘.比如说一个方块,你存盘的时候只要把起始点的坐标,宽度,高度颜色等等存进去,当再显示的时候再在原处把它画出来. 序列化:把一个object直接转换成字节流写到硬盘上或者写到网络上.

java基础入门-对象流与序列化

概念 对象序列化:将对象输入到流里面,并在之后将其读回. 注意事项 对象需要实现Serializable接口,Serializable接口没有任何方法,不需要重写 由于对象可能会重复使用,对象暂用不再是原来的内存地址,因此,序列化过程中引入序列号这个东西,如下图 序列化用途 对象通过序列化,然后在网络中传输,不同的机器负责不同的计算部分,从而实现分布式计算,提高计算的效率 版权声明:本文为博主原创文章,未经博主允许不得转载.