博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对象的序列化
阅读量:4657 次
发布时间:2019-06-09

本文共 2138 字,大约阅读时间需要 7 分钟。

目的:将一个具体的对象进行持久化,写入到硬盘上。

注意:静态数据不能被序列化,因为静态数据不在堆内存中,是存储在静态方法区中。

 

如何将非静态的数据不进行序列化?transient 关键字修饰此变量即可。

 

Serializable用于启动对象的序列化功能,可以强制让指定类具备序列化功能,该接口中没有成员,这是一个标记接口。这个标记接口用于给序列化类提供UID。这个uid是依据类中的成员的数字签名进行运行获取的。如果不需要自动获取一个uid,可以在类中,手动指定一个名称为serialVersionUID id号。依据编译器的不同,或者对信息的高度敏感性。最好每一个序列化的类都进行手动显示的UID的指定。

 

import java.io.*;

class ObjectStreamDemo {

    public static void main(String[] args) throws Exception{

       writeObj();

       readObj();

    }

    public static void readObj()throws Exception{

       ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt"));

       Object obj = ois.readObject();//读取一个对象。

       System.out.println(obj.toString());

    }

    public static void writeObj()throws IOException{

       ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));

       oos.writeObject(new Person("lisi",25)); //写入一个对象。

       oos.close();

    }

}

class Person implements Serializable{

    private static final long serialVersionUID = 42L;

    private transient String name;//transient修饰后name将不会进行序列化

    public int age;

    Person(String name,int age){

       this.name = name;

       this.age = age;

    }

    public String toString(){

       return name+"::"+age;

    }

}

-----------------------------------------------------------------------------------------------

DataOutputStreamDataInputStream专门用于操作基本数据类型数据的对象。

DataOutputStream dos =  new DataOutputStream(new FileOutputStream("data.txt"));

    dos.writeInt(256);

    dos.close();

 

    DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"));

    int num = dis.readInt();

    System.out.println(num);

    dis.close();

-----------------------------------------------------------------------------------------------

ByteArrayInputStream:源:内存

ByteArrayOutputStream:目的:内存。

这两个流对象不涉及底层资源调用,操作的都是内存中数组,所以不需要关闭。

直接操作字节数组就可以了,为什么还要把数组封装到流对象中呢?因为数组本身没有方法,只有一个length属性。为了便于数组的操作,将数组进行封装,对外提供方法操作数组中的元素。

 

对于数组元素操作无非两种操作:设置(写)和获取(读),而这两操作正好对应流的读写操作。这两个对象就是使用了流的读写思想来操作数组。

//创建源:

    ByteArrayInputStream bis = new ByteArrayInputStream("abcdef".getBytes());

    //创建目的:

    ByteArrayOutputStream bos = new ByteArrayOutputStream();

    int ch = 0;

    while((ch=bis.read())!=-1){

       bos.write(ch);

    }

    System.out.println(bos.toString());

转载于:https://www.cnblogs.com/wqing7/p/5896102.html

你可能感兴趣的文章
Python:将数组中的元素导出到变量中 (unpacking)
查看>>
ubuntu16.04安装mysql5.6
查看>>
mysql命令行中执行sql的几种方式总结
查看>>
ubantu 文件权限 Permission denied
查看>>
Python 多态 对象常用内置函数 运算符重载 对象迭代器 上下文管理
查看>>
Python 反射 元类 单例 冒泡
查看>>
Python socket 粘包问题 报头
查看>>
Python Django 数据库查询优化 事务
查看>>
Python django mtv与mvc ajax 分页器 序列化组件
查看>>
Python Django 多对多三种创建方式 form组件 cookie和session
查看>>
Python Django 生命周期 中间键 csrf跨站请求伪造 auth认证模块 settings功能插拔式源码...
查看>>
系统_Linux目录结构及功能
查看>>
安装_解决”此主机 Intel VT-x, 但Intel VT- x处于禁用状态“问题
查看>>
本地安装SQL Server 2017 Express和Microsoft SQL Server Management Studio 18.1
查看>>
VBA分别使用MSXML的DOM属性和XPATH进行网页爬虫
查看>>
C#避免WinForm窗体假死
查看>>
Java 异常处理 练习2
查看>>
单步查询--数组续
查看>>
存储设备 S2600设备 介绍
查看>>
S3 服务(Simple Storage Service简单存储服务) 简介(与hdfs同一级)
查看>>