java中的对象的序列化,以及新的try...catch块学习

对象的序列化和反序列化:

1、对象的序列需要实现java.util.Serializable或者是java.io.Externalizable接口。

2、Serializable只是一个接口,代表着可序列化,并没有定义任何的抽象方法,只能序列化非静态的,以及没有使用transient关键字修饰的属性,使用此接口最好声明一          个“private static final long serialVersionUID = 1L;”常量,确保在类的修改等操作之后,也能够反序列化

3、其中Externalizable接口继承Serializable接口,可以自定义序列化、反序列化的属性(包含静态属性和transient的),此接口多出了两个抽象方法

  writeExternal(ObjectOutput out) throws IOException  :用于自定义需要序列化的属性

  writeExternal(ObjectOutput out) throws IOException :用于自定义需要反序列化的属性

4、另一个try(){}...catch(){}finally{}...,这种try...catch可以自动关闭资源,省去了手动关闭的麻烦

  try(括号中放需要关闭的资源类代码){此括号中放逻辑代码}catch(异常){}finally{}

示例:

package javase.day23;

import java.io.Externalizable;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;

public class TestExternalizable {
  public static void main(String[] args) {

    //自1.7之后的另一个try(){}...catch(){}...
    try(
      FileOutputStream fos = new FileOutputStream("student.obj");
      ObjectOutputStream oos = new ObjectOutputStream(fos);

      FileInputStream fis = new FileInputStream("student.obj");
      ObjectInputStream ois = new ObjectInputStream(fis);

    ){
      Student student = new Student("tom");
      Student.school = "二中";
      student.setAge(18);
      oos.writeObject(student);

      Student stu = (Student) ois.readObject();
      System.out.println(stu);

    }catch (IOException e) {

      e.printStackTrace();
    } catch (ClassNotFoundException e) {

      e.printStackTrace();
    }

  }
}

class Student implements Externalizable{
  private transient String name;
  public static String school = "一中";
    private int age;
  
  public Student() {
    super();
  }

  public Student(String name) {
    super();
    this.name = name;
  }

  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 "Student [name=" + name + ", age = " + age + ", school = " + school + "]";
  }

  @Override
  public void writeExternal(ObjectOutput out) throws IOException {

    out.writeUTF(name);
    out.writeUTF(school);
  }

  @Override
  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {

    name = in.readUTF();
    school = in.readUTF();
  }

}

原文地址:https://www.cnblogs.com/dirsoen/p/12625443.html

时间: 2024-10-29 17:02:36

java中的对象的序列化,以及新的try...catch块学习的相关文章

java中的对象的序列化与反序列化的知识点---IO学习笔记(四)

对象的序列化,反序列化 对象的序列化: 就是将Object转换成byte序列 对象的反序列化: 将byte序列转换成Object 序列化流,反序列化流 序列化流(ObjectOutputStream),是字节的过滤流->主要方法:writeObject() 反序列化流(ObjectInputStream)->主要方法:readObject() 序列化接口(Serializable) 对象必须实现序列化接口,才能进行序列化,否则将出现异常 这个接口,没有任何方法,只是一个标准. 基本的对象序列化

Java中的对象序列化

好久没翻译simple java了,睡前来一发.译文链接:http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在Java中,对象序列化指的是将对象用字节序列的形式表示,这些字节序列包含了对象的数据和信息,一个序列化后的对象可以被写到数据库或文件中,并且支持从数据库或文件中反序列化,从而在内存中重建对象: 为什么需要序列化 序列化经常被用于对象的网络传输或本地存储.网络基础设施和硬盘只能识别位和字节信息,而不能识别Jav

【学习笔记】Java中生成对象的5中方法

概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.reflect.Constructor类的newInstance()实例方法. 4.调用对象的clone()方法. 5.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. 一.使用new关键字 这是最常见也是最简单的创建对象的方式了.通过这种方式

Java中字符串对象

Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式.然而这两种实现其实存在着一些性能和内存占用的差别.这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池. 工作原理 当代码中出现字

java中关于对象的复制

java中的对象复制有两种方法,可以简略的称为浅克隆和深克隆 浅克隆:调用object的clone接口实现克隆,之所以称为浅克隆,是因为在复制的过程中将对象的成员变量中的基本数据类型直接复制,但是对于引用数据类型只是将复制对象成员变量的引用传递过去,并没有对于新对象生成新的成员变量,需要注意的地方,object的clone()方法的访问修饰符是protect的,所以,需要在对象中重写clone方法,将其访问修饰符修改为public方法即可 深克隆:将当前对象以及对象的成员变量完整的复制,生成一个

Java中String对象的不可变性

首先看一个程序 package reverse; public class Reverse { public static void main(String[] args) { String c1=new String("abc"); String c2=new String("abc"); String c3=c1; System.out.println("c1==c2:"+ (c1==c2)); System.out.println(&quo

java中String对象和String变量

java中String对象和String变量 (2011-12-27 20:40:27) 转载▼ 标签: it 最近在论坛上看到关于String s = new String("XYZ") + new String("XYZ");到底创建几个对象的讨论,觉得比较有意思,在此总结一下. 在JAVA中除了8种基本类型之外,其他的都是类对象及其引用.所以 "XYZ"在JAVA中是一个String对象,对于String类对象来说它的对象值是不能修改的,也

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

Java中计算对象的大小

一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTraceUtils的sizeof方法: 3.http://yueyemaitian.iteye.com/blog/2033046中提供的代码计算: 4.https://github.com/mingbozhang/memory-measurer提供的工具包: 本质上java.lang.instrument