热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java序列化对象传给PHP的方法及原理解析

本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。

本文目录一览:


  • 1、java如何进行进行对象传递???


  • 2、序列化的方式有哪些


  • 3、简单分析PHP中序列化用法介绍


  • 4、Java 能 反序列化Php的数据么?


  • 5、java序列化原理


  • 6、java 序列化的问题

java如何进行进行对象传递???

你所说的“B文件中的a' =null,报异常,”

不能说明“a没有传递过来”而是B文件中:

A a' = new A();“ a' ” 对象就没有创建成功。

解决方法:你可将 A文件中的public A aa;“aa”设置成静态(static)的。

序列化的方式有哪些

序列化

序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化使其他代码可以查看或修改,那些不序列化便无法访问的对象实例数据。确切地说,代码执行序列化需要特殊的权限:即指定了 SerializationFormatter 标志的 SecurityPermission。在默认策略下,通过 Internet 下载的代码或 Internet 代码不会授予该权限;只有本地计算机上的代码才被授予该权限。

通常,对象实例的所有字段都会被序列化,这意味着数据会被表示为实例的序列化数据。这样,能够解释该格式的代码有可能能够确定这些数据的值,而不依赖于该成员的可访问性。类似地,反序列化从序列化的表示形式中提取数据,并直接设置对象状态,这也与可访问性规则无关。

对于任何可能包含重要的安全性数据的对象,如果可能,应该使该对象不可序列化。如果它必须为可序列化的,请尝试生成特定字段来保存不可序列化的重要数据。如果无法实现这一点,则应注意该数据会被公开给任何拥有序列化权限的代码,并确保不让任何恶意代码获得该权限。

中文名

序列化

外文名

Serialization

类型

概念

类别

通信

快速

导航

技术

Java编程中的序列化

PHP

目的

1、以某种存储形式使自定义对象持久化;

2、将对象从一个地方传递到另一个地方。

3、使程序更具维护性。

技术

* 二进制序列化保持类型保真度,这对于在应用程序的不同调用之间保留对象的状态很有用。例如,通过将对象序列化到剪贴板,可在不同的应用程序之间共享对象。您可以将对象序列化到流、磁盘、内存和网络等等。远程处理使用序列化“通过值”在计算机或应用程序域之间传递对象。

* XML 序列化仅序列化公共属性和字段,且不保持类型保真度。当您要提供或使用数据而不限制使用该数据的应用程序时,这一点是很有用的。由于 XML 是一个开放式标准,因此,对于通过 Web 共享数据而言,这是一个很好的选择。SOAP 同样是一个开放式标准,这使它也成为一个颇具吸引力的选择。

Java编程中的序列化

序列化的实现方法

把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。对于这种通用的操作,我们为什么不使用统一的格式呢?没错,这里就出现了java的序列化的概念。在Java的OutputStream类下面的子类ObjectOutputStream类就有对应的WriteObject(Object object) 其中要求对应的object实现了java的序列化的接口。

在使用tomcat开发JavaEE相关项目的时候,我们关闭tomcat后,相应的session中的对象就存储在了硬盘上,如果我们想要在tomcat重启的时能够从tomcat上面读取对应session中的内容,那么保存在session中的内容就必须实现相关的序列化操作,还有jdbc加载驱动用的就是反序列化,将字符串变为对象。

简单分析PHP中序列化用法介绍

简单分析PHP中序列化用法介绍

序列化在我们学习php中都会有用到了对于序列化我们常用的函数有serialize和unserialize了,希望以下这篇文章能够帮助到各位了解到PHP中序列化用法,具体如下:

0x00 序列化函数

serialize():返回带有变量类型和值的字符串

unserialize():想要将已序列化的字符串变回 PHP 的值

测试代码:

?php

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$a = $a;

$this-b = $b;

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$a = 'hello';

$b = 123;

$c = false;

$d = new test('helloa','hellob','helloc');

$e = new test1('hello');

var_dump(serialize($a));

var_dump(serialize($b));

var_dump(serialize($c));

var_dump(serialize($d));

var_dump(serialize($e));

?

运行结果:

string 's:5:"hello";' (length=12)

string 'i:123;' (length=6)

string 'b:0;' (length=4)

string 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' (length=46)

string 'O:5:"test1":2:{s:1:"a";s:5:"hello";s:1:"b";N;}' (length=46)

序列化字符串格式: 变量类型:变量长度:变量内容 。

如果序列化的是一个对象,序列化字符串格式为:

变量类型:类名长度:类名:属性数量:{属性类型:属性名长度:属性名;属性值类型:属性值长度:属性值内容}

将上述结果反序列化输出,执行结果:

string 'hello' (length=5)

int 123

boolean false

object(test)[1]

public 'a' = null

public 'b' = string 'hellob' (length=6)

object(test1)[1]

public 'a' = string 'hello' (length=5)

public 'b' = null

0x01 对象序列化

当序列化对象时,PHP 将在序列动作之前调用该对象的成员函数 sleep()。这样就允许对象在被序列化之前做任何清除操作。类似的,当使用 unserialize() 恢复对象时, 将调用 wakeup()成员函数。

在serialize()函数执行时,会先检查类中是否定义了 sleep()函数,如果存在,则首先调用 sleep()函数,如果不存在,就保留序列字符串中的所有属性。

在unserialize()函数执行时,会先检查是否定义了 wakeup()函数。如果 wakeup()存在,将执行__wakeup()函数,会使变量被重新赋值。

serialize()测试代码:

?php

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$this-a = $a;

$this-b = $b;

}

function __sleep(){

echo "b has changed"."\n";

$this-b = 'hib';

return $this-b;

}

function __wakeup(){

echo "a has changed"."\n";

$this-a = 'hia';

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$d = new test('helloa','hellob','helloc');

$e = new test1('hello');

serialize($d);

serialize($e);

var_dump($d);

var_dump($e);

?

执行结果:

b has changed b has changed

object(test)[1]

public 'a' = string 'helloa' (length=6)

public 'b' = string 'hib' (length=3)

object(test1)[2]

public 'a' = string 'hello' (length=5)

public 'b' = string 'hib' (length=3)

unserialize()测试代码:

class test{

var $a;

var $b;

function __construct($a,$b,$c){

$this-a = $a;

$this-b = $b;

}

function __sleep(){

echo "b has changed"."\n";

$this-b = 'hib';

return $this-b;

}

function __wakeup(){

echo "a has changed"."\n";

$this-a = 'hia';

}

}

class test1 extends test{

function __construct($a){

$this-a = $a;

}

}

$d = 'O:4:"test":2:{s:1:"a";N;s:1:"b";s:6:"hellob";}' ;

Java 能 反序列化Php的数据么?

理论上可以,不过你的php传过来的数据是怎么序列化的,是用php序列化的?

那需要你自己写规则和php的序列化对应的反序列化。

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;

}

java 序列化的问题

序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。

序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例

序列化的什么特点:

如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。

什么时候使用序列化:

一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。

二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。


推荐阅读
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • moment 国际化设置中文语言 (全局) 及使用示例 ... [详细]
  • ASP.NET MVC中Area机制的实现与优化
    本文探讨了在ASP.NET MVC框架中,如何通过Area机制有效地组织和管理大规模应用程序的不同功能模块。通过合理的文件夹结构和命名规则,开发人员可以更高效地管理和扩展项目。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
author-avatar
手机用户2502922083
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有