学习Java必备的基础知识打卡12.28,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

Posted java厂长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习Java必备的基础知识打卡12.28,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#相关的知识,希望对你有一定的参考价值。

Day34-Java之对象序列化

@[toc]

关于作者

• 作者介绍

所有的项目都一定有序列化的概念。

对象序列化的概念

所谓的对象序列化是指在内存中保存的对象变为二进制流的形式进行传输,或者将其保存在文本中。但是我们并不意味着所有对象都可以被序列化,严格来讲,我们需要被实例化的类对象往往需要传输使用,同时这个类 必须实现java.io.Serializable接口。但是这个接口没有任何方法定义,所以只是一个标识。

package com.day15.demo;

import java.io.Serializable;

class Person implements Serializable
    private String name;
    private int age;
    public Person(String name, int age) 
        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;
    

public class SerializableDemo 

序列化对象是所需要保存的就是对象中的属性所以默认情况下对象的属性将被转为二进制数据流存储。

实现序列化和反序列化

如果要想进行对象的序列化和反序列话的手工操作,在java之中提提供了两个操作类:ObjectOutputStream,ObjectInputStream,而这两个类的继承结构,构造方法,操作方法定义如下:

ObjectOutputStream ObjectInputStream
java.lang.Object<br/> java.io.OutputStream<br/> java.io.ObjectOutputStream java.lang.Object<br/> java.io.InputStream<br/> java.io.ObjectInputStream
public ObjectOutputStream(OutputStream out)<br/>throws IOException public ObjectInputStream(InputStream in)<br/>throws IOException
public final void writeObject(Object obj)<br/>throws IOException public final Object readObject()<br/>throws IOException,ClassNotFoundException

package com.day15.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;

class Person implements Serializable
    private String name;
    private int age;
    public Person(String name, int age) 
        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 + "]";
    

public class SerializableDemo
    public static final File FILE = new File("F:" + File.separator + "test" + File.separator + "person.txt");
    public static void ser(Object o) throws Exception 
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILE));
        outputStream.writeObject(o);
        outputStream.close();
    
    public static void dser() throws Exception 
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(FILE));
        System.out.println(inputStream.readObject());
        inputStream.close();
    
    public static void main(String[] args) throws Exception
        //序列化
        //ser(new Person("张麻子",20));
        //反序列化
        dser();
    

如果出现com.day15.demo.Person@6d311334这个情况的主要原因是因为实体类没有进行toString()方法的重写。

transient关键字(了解)

实际上序列化的处理在Java.io有两类,Serializable是使用最多的序列化接口,这种操作采用自动化的模式完成,默认情况下所有的属性都会进行序列化。有一个Externalizable接口需要用户手动序列化处理。

由于默认情况Serializable会将对象中的所有属性进行保存,但是如果现在有某些属性不希望被保存了,那么可以使用transient关键字。

package com.day15.demo;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Arrays;

class Person implements Serializable
    private transient String name;
    private int age;
    public Person(String name, int age) 
        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 + "]";
    

public class SerializableDemo
    public static final File FILE = new File("F:" + File.separator + "test" + File.separator + "person.txt");
    public static void ser(Object o) throws Exception 
        ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream(FILE));
        outputStream.writeObject(o);
        outputStream.close();
    
    public static void dser() throws Exception 
        ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream(FILE));
        System.out.println(inputStream.readObject());
        inputStream.close();
    
    public static void main(String[] args) throws Exception
        ser(new Person("张麻子",20));
        dser();
    

/*
Person [name=null, age=20]
*/

发现此处name没有进行序列化操作。使用序列化往往在简单java类上使用,其他类上使用序列化的使用很少,但是在简单java类中基本上不去使用transient。

以上是关于学习Java必备的基础知识打卡12.28,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#的主要内容,如果未能解决你的问题,请参考以下文章

学习Java必备的基础知识打卡12.20,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.27,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.16,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.19,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.22,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#

学习Java必备的基础知识打卡12.23,要想学好必须扎实基本功(⭐建议收藏)#yyds干货盘点#