感悟网 导航

java序列化原理 怎样做才能让Java 序列化机制 更安全

作者&投稿:璩录 (若有异议请与网页底部的电邮联系)
为什么java要实现对象序列化~

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,将数据分解成字节流,以便存储在文件中或在网络上传输。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements
Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object
obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流;

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例
  序列化的什么特点:
  如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
  什么时候使用序列化:
  一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
  二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的”深复制”,即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。

  Java 序列化 serialization主要职责就是将一个对象的状态转化为一个字节序列,以方便对象的持久化或网络传输。反序列化的过程正好相反。开发人员所要做的只是实现Serializable接口,然后调用ObjectOutputStream/ObjectInputStream的WriteObject/ReadObject方法即可,其他的工作 JVM 会自动帮你做了。
  那通过实现Serializable 接口所获取的序列化能力是否有安全隐患?由于这些字节序列已经脱离了Java的安全体系存在于磁盘或网络上,我们能否对序列化后的字节序列进行查看和修改,甚至于注入恶意病毒呢? Java 反序列化机制是否又会对建立的对象进行验证以确保它的安全性、准确性呢? 如果你想到这些问题,那恐怕答案会让你失望了。Java序列化后的字节序列基本都是明文存在的,而且字节序列的组成有很明确的文档进行说明,你可以试着用一些十六进制的文本编辑工具,如Hexeditor 查看一下对象序列化后的内容,你都能看到很多私有变量的实际赋值。关于字节序列的说明,可参考对象序列化流协议 ,这里就不多说了。这篇文章的重点是说一些Java提供的安全机制,通过这些机制,我们能够提升序列化/反序列化的安全指数。

将要序列化的对象实现Serializable接口,
Serializable接口没有需要实现的方法,
implements Serializable只是为了标注该对象是可被序列化的,
然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

例子:

import java.io.*;

public class Test
{
public static void main(String[] args)
{
Employee harry = new Employee("Harry Hacker", 50000);
Manager manager1 = new Manager("Tony Tester", 80000);
manager1.setSecretary(harry);

Employee[] staff = new Employee[2];

staff[0] = harry;
staff[1] = manager1;
try
{
ObjectOutputStream out = new ObjectOutputStream(
new FileOutputStream("employee.dat"));
out.writeObject(staff);
out.close();

ObjectInputStream in = new ObjectInputStream(
new FileInputStream("employee.dat"));
Employee[] newStaff = (Employee[])in.readObject();
in.close();

/**
*通过harry对象来加薪
*将在secretary上反映出来
*/
newStaff[0].raiseSalary(10);

for (int i = 0; i < newStaff.length; i++)
System.out.println(newStaff[i]);
}
catch (Exception e)
{
e.printStackTrace();
}
}

}

#p# class Employee implements Serializable
{
public Employee(String n, double s)
{
name = n;
salary = s;
}

/**
*加薪水
*/
public void raiseSalary(double byPercent)
{
double raise = salary * byPercent / 100;
salary += raise;
}

public String toString()
{
return getClass().getName()
+ "[name = "+ name
+ ",salary = "+ salary
+ "]";
}

private String name;
private double salary;
}

class Manager extends Employee
{
public Manager(String n, double s)
{
super(n, s);
secretary = null;
}

/**
*设置秘书
*/
public void setSecretary(Employee s)
{
secretary = s;
}

public String toString()
{
return super.toString()
+ "[secretary = "+ secretary
+ "]";
}

//secretary代表秘书
private Employee secretary;
}

对象就是数据和方法的一个组合体,对象的数据类型比较抽象,
直接网络传输肯定不会像传个Integer类型那么容易,得把比较抽象的
对象转换成基本的数据类型(比如说字符串,数字,boolean等)才好传输..
序列化就是数据转换的一种方式(它应该把对象转换成字符串了,字符串具体描述了对象的一切信息..根据我php编程的经验),字符串传输,问题肯定不大....

你接受那边必然还需要反序列化转换一次才能得到所传输的对象....

《什么是java序列化,如何实现java序列化?》
答:在java中只要一个类实现了Serializable接口的类就被认为是序列化的类,这种类的对象就是序列化的对象 只有被序列化的数据才允许被存储到文件、数据库之中或者通过网络协议进行传输,没有被序列化的数据是不能存储到硬盘上,不能通过网络协议进行网络传输 ...

《Java中为什么要序列化?什么时候用到序列化》
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements ...

《序列化和反序列化》
答:所以,Java中的序列化就是把Java对象变成二进制内容的一个过程,也就是从内存中把数据存储下来,而数据在内存中都是二进制的形式!记住了,Java序列化出来的东西就是一个二进制内容,就是对象在内存中的存储形式!变量存储角度理解序列化接下来我们再以变量在内存中的存储为例去理解什么是序列化!举一个例子,比如我们写...

《什么是java的序列化?jdk如何实现java序列化》
答:Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上 传送。那么当两个Java进程...

《java中为什么要进行对象序列化》
答:一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行...

《在java里如何使用数据库中的序列(java中的序列化)》
答:首先说明一下序列化的知识:java中的序列化()机制能够将一个实例对象的状态信息写入到一个字节流中,使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中;然后在需要的时候,可以根据字节流中的信息来重构一个相同的对象 序列化机制在java中有着广泛的应用,EJB、RMI等技术都是以此为基础的...

《什么是java的序列化和反序列化》
答:3、transient 关键字,主要用来忽略我们不希望进行序列化的变量 2.3、将对象进行序列或和反序列化 如果你想学习Java可以来这个群,首先是一二六,中间是五三四,最后是五一九,里面有大量的学习资料可以下载。2.3.1 第一种写入方式:public static void main(String[] args){ File file = new File(...

《浅谈Java对象的序列化和反序列化》
答:一 JDK类库中的序列化API java io ObjectOutputStream代表对象输出流 它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化 把得到的字节序列写到一个目标输出流中 java io ObjectInputStream代表对象输入流 它的readObject()方法从一个源输入流中读取字节序列 再把它们反序列化为一个对象 ...

《Java对象序列化使用基础》
答:Java对象序列化机制一般来讲有两种用途:Java的JavaBeans: Bean的状态信息通常是在设计时配置的,Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息,这需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态。RMI允许象在本机上一样操作远程机器上的对象;或使用套接字在网络...

《socket传输中,java的对象序列化和反序列化过程中是如何确保数据的完整...》
答:public transient Thread t; //t不会被序列化 private String customerID;private int total;} ·编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。[java] ...

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网