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


推荐阅读
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 基因组浏览器中的Wig格式解析
    本文详细介绍了Wiggle(Wig)格式及其在基因组浏览器中的应用,涵盖variableStep和fixedStep两种主要格式的特点、适用场景及具体使用方法。同时,还提供了关于数据值和自定义参数的补充信息。 ... [详细]
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社区 版权所有