须要序列化的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. 【leetcode】371. Sum of Two Integers

    题目描述: Calculate the sum of two integers a and b, but you are not allowed to use the operator + and - ...

  2. 洛谷P4145 上帝造题的七分钟2/花神游历各国 [树状数组,并查集]

    题目传送门 题目背景 XLk觉得<上帝造题的七分钟>不太过瘾,于是有了第二部. 题目描述 "第一分钟,X说,要有数列,于是便给定了一个正整数数列. 第二分钟,L说,要能修改,于是 ...

  3. Python3 文件读写r,w,a

    # Author;Tsukasa ''' f = open('yesterday','w') #文件句柄...注意open分为‘r’读模式,‘w’写模式(d会先创建文件或者覆盖文件),‘a’为追加模式 ...

  4. JSP2 自定义标签

    实现步骤 实现自定义标签的处理类继承javax.servlet.jsp.tagext.SimpleTagSupport,并重写doTag方法 建立标签库配置文件 在jsp中使用自定义标签 一个简单的标 ...

  5. 手机发送验证码—.net代码

    注册过程中,短信发送验证码流程如下: (1).用户提交手机号码,申请湖区验证码 (2).网站按照预制规则生成验证码 (3).网站将用户手机号码和验证码发送到短信平台 (4).将制定内容发送到制定手机号 ...

  6. poj 1348 Period(KMP)

    Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. 【穷竭】POJ3187-Backward Digit Sums

    [思路] 利用杨辉三角形,每一个数字被加的次数等于它在杨辉三角形中对应的那个数字.注意这道题的意思是,最底层是N的全排序,而不是指1..10都可以.生成杨辉三角形的时候第一次我用了二重循环模拟生成,后 ...

  8. 使用redis时出现java.util.ArrayList cannot be cast to java.lang.Long

    java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long at redis.clients. ...

  9. Problem A: 零起点学算法91——找出一个数组中出现次数最多的那个元素

    #include<stdio.h> int main() { ],b[]={}; while(scanf("%d",&n)!=EOF) { ;i<n;i+ ...

  10. Html 事件列表

    Html 事件列表 一般事件:onClick HTML: 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击onDblClick HTML: 鼠标双击事件onMouseDown HTML: 鼠标上的按 ...