须要序列化的Person类:

package cn.itcast_07;

import java.io.Serializable;

/*
* NotSerializableException:未序列化异常
*
* 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其不论什么状态序列化或反序列化。 * 该接口竟然没有不论什么方法。相似于这样的没有方法的接口被称为标记接口。 *
* java.io.InvalidClassException:
* cn.itcast_07.Person; local class incompatible:
* stream classdesc serialVersionUID = -2071565876962058344,
* local class serialVersionUID = -8345153069362641443
*
* 为什么会有问题呢? * Person类实现了序列化接口。那么它本身也应该有一个标记值。
* 这个标记值如果是100。
* 開始的时候:
* Person.class -- id=100
* wirte数据: oos.txt -- id=100
* read数据: oos.txt -- id=100
*
* 如今:
* Person.class -- id=200
* wirte数据: oos.txt -- id=100
* read数据: oos.txt -- id=100
* 我们在实际开发中,可能还须要使用曾经写过的数据,不能又一次写入。 怎么办呢?
* 回忆一下原因是由于它们的id值不匹配。
* 每次改动java文件的内容的时候,class文件的id值都会发生改变。
* 而读取文件的时候。会和class文件里的id值进行匹配。 所以,就会出问题。
* 可是呢,如果我有办法。让这个id值在java文件里是一个固定的值。这样。你改动文件的时候。这个id值还会发生改变吗? * 不会。 如今的关键是我怎样可以知道这个id值怎样表示的呢? * 不用操心,你不用记住。也没关系,点击鼠标就可以。
* 你难道没有看到黄色警告线吗?
*
* 我们要知道的是:
* 看到类实现了序列化接口的时候。要想解决黄色警告线问题。就行自己主动产生一个序列化id值。
* 并且产生这个值以后。我们对类进行不论什么改动,它读取曾经的数据是没有问题的。 *
* 注意:
* 我一个类中可能有非常多的成员变量。有些我不想进行序列化。请问该怎么办呢?
* 使用transientkeyword声明不须要序列化的成员变量
*/
public class Person implements Serializable {
private static final long serialVersionUID = -2071565876962058344L; private String name; // private int age; private transient int age;//transientkeyword表示不想被序列化 // int age; public Person() {
super();
} public Person(String name, int age) {
super();
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}

測试序列化和反序列化的类:

package cn.itcast_07;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; /*
* 序列化流:把对象依照流一样的方式存入文本文件或者在网络中传输。对象 -- 流数据(ObjectOutputStream)
* 反序列化流:把文本文件里的流对象数据或者网络中的流对象数据还原成对象。流数据 -- 对象(ObjectInputStream)
*/
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException,
ClassNotFoundException {
// 因为我们要对对象进行序列化,所以我们先自己定义一个类
// 序列化数据事实上就是把对象写到文本文件
// write(); read();
} private static void read() throws IOException, ClassNotFoundException {
// 创建反序列化对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
"oos.txt")); // 还原对象
Object obj = ois.readObject(); // 释放资源
ois.close(); // 输出对象
System.out.println(obj);
} private static void write() throws IOException {
// 创建序列化流对象
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(
"oos.txt")); // 创建对象
Person p = new Person("林青霞", 27); // public final void writeObject(Object obj)
oos.writeObject(p); // 释放资源
oos.close();
}
}

java中的序列化和反序列化学习笔记的更多相关文章

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

    package Serialize; /** * Created by hu on 2015/11/7. */ //实现序列化必须实现的接口,这就是一个空接口,起到标识的作用 import java. ...

  2. K:java中的序列化与反序列化

    Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?以下内容将围绕这些问题进行展开讨论. Java序列化与反序列化 简单来说Java序列化是指把Java对象转 ...

  3. Java中的序列化与反序列化

    序列化定义 将对象转换为字节流保存起来,并在以后还原这个对象,这种机制叫做对象序列化. 将一个对象保存到永久存储设备上称为持久化. 一个对象要想能够实现序列化,必须实现java.io.Serializ ...

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

    对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象. 对象序列化允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上或者通过网络将这种二进制流传输 ...

  5. C#序列化与反序列化学习笔记

    本笔记摘抄自:https://www.cnblogs.com/maitian-lf/p/3670570.html,记录一下学习过程以备后续查用. 序列化是把一个内存中的对象的信息转化成一个可以持久化保 ...

  6. java中的try-catch-finally异常处理(学习笔记)

    一.异常概述 异常:Exception,是在运行发生的不正常情况. 原始异常处理: if(条件) { 处理办法1 处理办法2 处理办法3 } if(条件) { 处理办法4 处理办法5 处理办法6 } ...

  7. java中的序列化和反序列化

    package cn.zhou; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.Fil ...

  8. java中有关socket通信的学习笔记

    最近做的项目中使用到了一些基于java的socket长连接的一些功能,用来穿透有关行业的网闸.用到了也就学习了一下,下面是对学习内容的一个笔记,记录一下也希望有兴趣的同学可以参考一下,加深对javas ...

  9. Java中对象的比较(学习笔记)

    1)详细说明对象的比较方式有哪些? ①对象引用的比较("= ="运算符) "= ="是将对象的引用进行比较,实质是比较两个引用变量是否引用同一个对象.注意的点: ...

随机推荐

  1. bzoj 1477 扩展欧几里德

    思路:很裸的求相遇问题. #include<bits/stdc++.h> #define LL long long #define fi first #define se second # ...

  2. centos7系统安装后的基础优化

    1.更改网卡信息 1.编辑网卡 # cd /etc/sysconfig/network-scripts/ # mv ifcfg-ens33 ifcfg-eth0 # mv ifcfg-ens37 if ...

  3. Trie树【UVA11362】Phone List

    Description 给定\(n\)个长度不超过\(10\)的数字串,判断是否有两个字符串\(A\)和\(B\),满足\(A\)是\(B\)的前缀,若有,输出NO,若没有,输出YES. 一道\(Tr ...

  4. XPath语法和CSS选择器介绍

    XPath语法 XPath 是一门在 XML 文档中查找信息的语言.XPath 可用来在 XML 文档中对元素和属性进行遍历.XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 ...

  5. java 日期validate

    public static boolean isValidDate(String str) { boolean convertSuccess=true; // 指定日期格式为四位年/两位月份/两位日期 ...

  6. WSDL格式浅析

    其中,WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操作.这种格式首先对操作和消息进行抽象描述,然后将其绑定到具体的网络协议和消息格式上 ...

  7. [bzoj3244][noi2013]树的计数 题解

    UPD: 那位神牛的题解更新了,在这里. ------------------------------------------------------------------------------- ...

  8. 【DFS】佳佳的魔法阵

    [vijos1284]佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放…… 描述 ...

  9. [CODE FESTIVAL 2017]Full Tournament

    题意:$2^n$个编号为$1\cdots2^n$的人打比赛,这个比赛会给每个人一个唯一的排名,比赛规则递归地定义如下: $2^n$个人打的是级别为$n$的比赛,初始时他们按某种顺序站成一排 当$n=0 ...

  10. json,xml,html三种数据格式

    json.xml.html xml解析如下: 1.DOM:基于XML文档树结构的解析 解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构.优点:整个文档 ...