JSONObject简介

JSONObject简介
JSONObject简介

JSONObject简介

本节摘要:之前对JSON做了一次简单的介绍,并把JSON和XML做了一个简单的比较;那么,我就在想,如果是一个json格式的字符串传到后台,需要怎么对其处理?如果前台页面需要后台返回的是一个json的字符串,那么后台是怎么把json格式的字符串给拼装起来的呢?JSON和XML是不是有某种联系,他们之间是不是可以互相转换?……带着这些问题,搜索了相关的资料,并自己实际动手操作,总算对这些问题有了个比较清晰的认识。这些问题主要是通过JSONObject这个插件的jar包实现。

preparation

1.JSONObject介绍

JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包。

2.下载jar包

https://www.360docs.net/doc/429248139.html,/java-pan/lib.rar

提供了除JSONObject的jar之外依赖的其他6个jar包,一共7个jar文件

说明:因为工作中项目用到的版本是1.1的对应jdk1.3的版本,故本篇博客是基于1.1版本介绍的。

对应此版本的javadoc下载路径如下:

https://www.360docs.net/doc/429248139.html,/projects/json-lib/files/json-lib/json-lib-1.1/

目前最新的版本为2.4,其他版本下载地址为

https://www.360docs.net/doc/429248139.html,/projects/json-lib/files/json-lib/

3.项目环境:

system:WIN7 myeclipse:6.5 tomcat:5.0 JDK:开发环境和编译用的都是1.5

项目结构如下:

说明:本次用到的的文件只有工程目录json包下的JSONObject_1_3类和note.txt

4.class&method 基于1.1的API

做以下几点约定:

1.介绍基于JSONObject 1.1的API

2.只介绍常用的类和方法

3.不再介绍此版本中已经不再推荐使用

4.介绍的类和方法主要围绕本篇博客中用到的

JSONObject:AJSONObject is an unordered collection of name/value pairs.

是一个final类,继承了Object,实现了JSON接口

构造方法如下:

JSONObject();创建一个空的JSONObject对象

JSONObject(booleanisNull);创建一个是否为空的JSONObject对象

普通方法如下:

fromBean(Object bean);静态方法,通过一个pojo对象创建一个JSONObject对象

fromJSONObject(JSONObject object);静态方法,通过另外一个JSONObject对象构造一个JSONObject对象

fromJSONString(JSONString string);静态方法,通过一个JSONString创建一个JSONObject对象

toString();把JSONObject对象转换为json格式的字符串

iterator();返回一个Iterator对象来遍历元素

接下来就是一些put/get方法,需要普通的get方法和pot方法做一下强调说明,API中是这样描述的:

A get method returns a value if one can be found, and throws an exception if one cannot be found. An opt method returns a default value instead of throwing an exception, and so is useful for obtaining optional values.

JSONArray:AJSONArray is an ordered sequence of values.

是一个final类,继承了Object,实现了JSON接口

构造方法如下:

JSONArray();构造一个空的JSONArray对象

普通方法如下:

fromArray(Object[] array);静态方法,通过一个java数组创建一个JSONArray 对象

fromCollection(Collection collection);静态方法,通过collection集合对象创建一个JSONArray对象

fromString(String string);静态方法,通过一个json格式的字符串构造一个JSONArray对象

toString();把JSONArray对象转换为json格式的字符串

iterator();返回一个Iterator对象来遍历元素

接下来同样是put/get方法……

XMLSerializer:Utility class for transforming JSON to XML an back.

一个继承自Object的类

构造方法如下:

XMLSerializer();创建一个XMLSerializer对象

普通方法如下:

setRootName(String rootName);设置转换的xml的根元素名称setTypeHintsEnabled(boolean typeHintsEnabled);设置每个元素是否显示type属性

write(JSON json);把json对象转换为xml,默认的字符编码是UTF-8,

需要设置编码可以用write(JSON json, String encoding)

5.对XML和JSON字符串各列一个简单的例子

JSON:

{"password":"123456","username":"张三"}

xml

123456

张三

start

新建web工程,工程名称JS,导入以下7个jar包,文件在前面的准备工作中下载路径。说明:可以不用新建web工程,普通的java工程也可以完成本篇的的操作。至于为什么要导入处json包以外的其他6个包,我会把note.txt贴在最后,各位一看便知。故以上7个jar包必须导入。

question1:后台接受到前台的json格式的字符串怎么处理?

public static void jsonToJAVA(){

System.out.println("json字符串转java代码");

String jsonStr="{\"password\":\"123456\",\"username\":\"张三\"}"; JSONObjectjsonObj=JSONObject.fromString(jsonStr);

String username=jsonObj.getString("username");

String password=jsonObj.optString("password");

System.out.println("json--->java\n username="+username+"\t

password="+password);

}

question2:后台是怎么拼装json格式的字符串?

public static void javaToJSON() {

System.out.println("java代码封装为json字符串");

JSONObjectjsonObj = new JSONObject();

jsonObj.put("password", "123456");

System.out.println("java--->json \n" + jsonObj.toString());

}

question3:json格式的字符串怎么转换为xml格式的字符串?

public static void jsonToXML() {

System.out.println("json字符串转xml字符串");

String jsonStr = "{\"password\":\"123456\",\"username\":\"张三\"}"; JSONObjectjson = JSONObject.fromString(jsonStr); XMLSerializerxmlSerializer = new XMLSerializer();

xmlSerializer.setRootName("user_info");

xmlSerializer.setTypeHintsEnabled(false);

String xml = xmlSerializer.write(json);

System.out.println("json--->xml \n" + xml);

}

question4:xml格式的字符串怎么转换为json格式的字符串?

public static void xmlToJSON(){

System.out.println("xml字符串转json字符串");

String xml = "

encoding=\"UTF-8\"?>123456张三";

JSON json=XMLSerializer.read(xml);

System.out.println("xml--->json\n"+json.toString());

}

question5:javabean怎么转换为json字符串?

public static void javaBeanToJSON() {

System.out.println("javabean转json字符串");

UserInfouserInfo = new UserInfo();

userInfo.setPassword("123456");

JSONObjectjson = JSONObject.fromBean(userInfo);

System.out.println("javabean--->json \n" + json.toString());

}

question6:javabean怎么转换为xml字符串?

public static void javaBeanToXML() {

System.out.println("javabean转xml字符串");

UserInfouserInfo = new UserInfo();

userInfo.setUsername("张三");

userInfo.setPassword("123456");

JSONObjectjson = JSONObject.fromBean(userInfo); XMLSerializerxmlSerializer = new XMLSerializer();

String xml = xmlSerializer.write(json, "UTF-8");

System.out.println("javabean--->xml \n" + xml);

}

result

代码和运行结果都已经贴在每个问题的后面,运行时直接用main方法分别对每个方法运行即可看到测试效果。

note.txt是报的对应的错误及解决方法,也从另一个方面说明为什么需要导入前面提到的jar包;

note.txt文件内容如下:

https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError:

org/apache/commons/lang/exception/NestableRuntimeException

at https://www.360docs.net/doc/429248139.html,ng.ClassLoader.defineClass0(Native Method)

at https://www.360docs.net/doc/429248139.html,ng.ClassLoader.defineClass(ClassLoader.java:537)

at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)

https://www.360docs.net/doc/429248139.html,.URLClassLoader.defineClass(URLClassLoader.java:251)

at https://www.360docs.net/doc/429248139.html,.URLClassLoader.access$100(URLClassLoader.java:55)

at https://www.360docs.net/doc/429248139.html,.URLClassLoader$1.run(URLClassLoader.java:194)

at java.security.AccessController.doPrivileged(Native Method)

at https://www.360docs.net/doc/429248139.html,.URLClassLoader.findClass(URLClassLoader.java:187)

at https://www.360docs.net/doc/429248139.html,ng.ClassLoader.loadClass(ClassLoader.java:289)

at https://www.360docs.net/doc/429248139.html,uncher$AppClassLoader.loadClass(Launcher.java:274)

at https://www.360docs.net/doc/429248139.html,ng.ClassLoader.loadClass(ClassLoader.java:235)

at https://www.360docs.net/doc/429248139.html,ng.ClassLoader.loadClassInternal(ClassLoader.java:302)

at generate.TestJSONObject.main(TestJSONObject.java:40)

Exception in thread "main"

解决方案:导入commons-lang-2.1.jar

https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError: org/apache/commons/logging/LogFactory at net.sf.json.JSONObject.(JSONObject.java:125)

at generate.TestJSONObject.main(TestJSONObject.java:40)

Exception in thread "main"

解决方案:导入commons-logging.jar

https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError: org/apache/commons/beanutils/DynaBean at net.sf.json.JSONObject.set(JSONObject.java:2164)

at net.sf.json.JSONObject.put(JSONObject.java:1853)

at net.sf.json.JSONObject.put(JSONObject.java:1806)

at generate.TestJSONObject.main(TestJSONObject.java:41)

Exception in thread "main"

解决方案:导入commons-beanutils.jar

https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError: net/sf/ezmorph/MorpherRegistry

at net.sf.json.util.JSONUtils.(JSONUtils.java:65)

at net.sf.json.JSONObject.set(JSONObject.java:2164)

at net.sf.json.JSONObject.put(JSONObject.java:1853)

at net.sf.json.JSONObject.put(JSONObject.java:1806)

at generate.TestJSONObject.main(TestJSONObject.java:41)

Exception in thread "main"

解决方案:导入ezmorph-1.0.2.jar

https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError:

org/apache/commons/collections/FastHashMap

at

https://www.360docs.net/doc/429248139.html,mons.beanutils.PropertyUtils.(PropertyUtils.java:208) at net.sf.json.JSONObject.fromBean(JSONObject.java:190)

at net.sf.json.JSONObject.fromObject(JSONObject.java:437)

at net.sf.json.JSONObject.set(JSONObject.java:2196)

at net.sf.json.JSONObject.put(JSONObject.java:1853)

at net.sf.json.JSONObject.put(JSONObject.java:1806)

at generate.TestJSONObject.main(TestJSONObject.java:41)

Exception in thread "main"

解决方案:导入commons-collections-3.0.jar

Exception in thread "main" https://www.360docs.net/doc/429248139.html,ng.NoClassDefFoundError: nu/xom/Serializer at generate.TestJSONObject.jsonToXML(TestJSONObject.java:88)

at generate.TestJSONObject.main(TestJSONObject.java:96)

解决方案:导入xom-1.0d10.jar

几点说明:

1.注意UserInfo类的修饰符,用public修饰,变量username和password也用public 修饰,最好单独的写一个类,这里就不贴出来了

2.以上json字符串和xml字符串都是最简单的形式,实际开发中json字符串和xml格式比这个复杂的多,

处理复杂的json字符串,可以封装写一个类继承HashMap,然后重写其put和get方法,以支持对类型为A[0].B及A.B的键值的读取和指定

3.以上6中情况在实际开发中可能有些不存在或不常用

存在的问题:

1.使用XMLSerializer的write方法生成的xml字符串的中文乱码问题

2.question4中的红色的log日志问题

2012-4-6 15:04:35 net.sf.json.xml.XMLSerializergetType

信息: Using default type string

希望各位指正,欢迎拍砖。

java序列化的作用

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下: 序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例 序列化的什么特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 什么时候使用序列化: 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 ====================== 可以看看接口java.io.serializable的中文解释: Serializable public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

C++序列化反序列化库Kapok

C++序列化/反序列化库Kapok 1.Kapok的特点 简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack 相当。 它是纯c++11实现,因此需要支持C++11的编译器。 2.主要功能 对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。 //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize(tp, "tuple"); //反序列化 DeSerializer dr; std::tuple p; dr.Parse(sr.GetString()); dr.Deserialize(p, "tuple"); 看起来是不是很简单! 再看一个序列化一个自定义对象的例子。 struct Person { int age; string name; string city; META(age, name, city) }; Person p = { 18, "bb", "aa" }; //序列化 Serializer sr; sr.Serialize(p, "Person"); //反序列化 DeSerializer dr;

Person person; dr.Parse(sr.GetString()); dr.Deserialize(person, "Person"); 一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。 3.应用场景 Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。 4.结构体必须有一个宏定义是否具有侵入性? 看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射,必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。 5.Kapok是如何实现序列化/反序列化的 Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图: 6.Kapok的性能如何 初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。 7.Kapok是否支持多语言 暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,

JAVA序列化基础知识Serializable与Externalizable的区别

大家都知道Serializable是一个mark interface,告诉JVM这个对象可以被转换成二进制流来传输. 但是Serializable与Externalizable的转换二进制流的过程是不一样的. Serializable 在我们实现这个接口的时候,我们可以使用4个私有方法来控制序列化的过程: 我们来看一个例子: public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); System.out.println("got message:" + message); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }

使用json-lib完成json的序列化和反序列化

使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43 分类:默认分类 | 标签:软件 java json. json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。 我的pojo对象的结构是这样的 部门表和员工表 1对多的关系 部门对象 public class Dept implements java.io.Serializable { private Integer depid;//部门ID private String depname;//部门名称 private Set emps = new HashSet(0);//员工集合 } 员工对象 public class Emp implements java.io.Serializable { private Integer empid;//员工id private Dept dept;//部门 private String empname;//员工名称 private Date birthday;//生日 } 1.json字符串序列化成对象 /** *通过json转换成对象 *@author凤生禾予 */ public void jsonToObject(){ Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer str=new StringBuffer(); // json字符串 str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三 ',birthday:'"+sdf.format(d)+"'}"); // 使用JSONObject将json序列化对象 JSONObject obj=JSONObject.fromObject(str.toString()); // 将JOSNObject对象转换成pojo对象 Emp emp=(Emp) JSONObject.toBean(obj,Emp.class); System.out.println(emp.getBirthday()); } 这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号

Java序列化的机制和原理

Java序列化的机制和原理 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。 1.import java.io.Serializable; 2. 3.class TestSerial implements Serializable { 4. 5.public byte version = 100; 6. 7.public byte count = 0; 8. 9.} 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。 1.public static void main(String args[]) throws IOException { 2. 3. FileOutputStream fos = new FileOutputStream("temp.out "); 4. 5. ObjectOutputStream oos = new ObjectOutputStream(fos); 6. 7. TestSerial ts = new TestSerial();

Java对象的序列化和反序列化实践

Java对象的序列化和反序列化实践 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 把Java对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为Java对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2)在网络上传送对象的字节序列。 一.JDK类库中的序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。、 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。 对象序列化包括如下步骤: 1)创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流; 2)通过对象输出流的writeObject()方法写对象。 对象反序列化的步骤如下: 1)创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;

Java的序列化与反序列化

Java的序列化与反序列化 原创不易,望各位转载注明出处:北京尚学堂 java序列化是一种对象持久化的手段。普遍应用在网络传输、RMI等场景中。 本文通过分析ArrayList的序列化来介绍Java序列化的相关内容。主要涉及到 以下几个问题: 怎么实现Java的序列化 为什么实现了java.io.Serializable接口才能被序列化 transient的作用是什么 怎么自定义序列化策略 自定义的序列化策略是如何被调用的 ArrayList对序列化的实现有什么好处 Java对象的序列化 Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM 的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能 够帮助我们实现该功能。 使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的”状态”,即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。 除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或 在网络中传递对象时,都会用到对象序列化。Java序列化API为处理对象序列 化提供了一个标准机制,该API简单易用。 如何对Java对象进行序列化与反序列化

在Java中,只要一个类实现了java.io.Serializable接口,那么它就可以被序列化。这里先来一段代码: code 1 创建一个User类,用于序列化及反序列化 package com.hollis; import java.io.Serializable; import java.util.Date; /** * Created by hollis on 16/2/2. */ public class User implements Serializable{ private String name; private int age; private Date birthday; private transient String gender; private static final long serialVersionUID = -6849794470754667710L; public String getName() { return name; } public void setName(String name) { https://www.360docs.net/doc/429248139.html, = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; }

java对象的序列化和反序列化详细介绍解析

java 对象的序列化和反序列化详细介绍 这篇文章主要介绍了java 对象的序列化和反序列化的相关资料,需要的朋友可以参考下 最近周末,对java 的基础知识做了一个整理,其中java 序列化和反序列化的资料进行了详细整理,这里做个笔记,希望也能帮助到读到此文的朋友。 一、序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 对象的序列化主要有两种用途: 1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 2)在网络上传送对象的字节序列。 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。 二、JDK类库中的序列化API java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。 java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。 只有实现了Serializable和Externalizable接口的类的对象才能被序列化。Externalizable 接口继承自Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以采用默认的序列化方式。 对象序列化包括如下步骤: 1)创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;

Java 反序列化 php 序列化后的对象

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 Java 反序列化php 序列化后的对象 2017/08/24 1429 Maven Dependency !-- https://mvnrepository/artifact/com.xk72/pherialize -- dependency groupId com.xk72 /groupId artifactId pherialize /artifactId version 1.2.4 /version /dependency Java Code package cong.juanpi.bi.hiveAntrl.onedata;import de.ailis.pherialize.MixedArray;import de.ailis.pherialize.Pherialize;/** * 从onedata 库中找出基础指标,与通过sql 解析后的元数据对应起来* Created by vkzhang@yeah on 2017/8/17. */public class PherializeToJava { public static void main(String[] args) { String data = “a:5:{i:1;a:35:{s:2:\”id\”;s:1:\”1\”;s:5:\”title\”;s:12:\”今日推荐\”;s:8:\”act_bg_c\”;s:0:\”\”;s:6:\”d_bg_c\”;s:0:\”\”;s:8:\”m_d_bg_c\”;s:0:\”\”;s:5:\”act_c\”;s :7:\”#FF464E\”;s:3:\”d_c\”;s:7:\”#333333\”;s:5:\”act_p\”;s:50:\”/bao/170629/b/0/5954f767 a9fcf84e99677411_72x72.png\”;s:3:\”d_p\”;s:50:\”/bao/170629/4/3/5954f7658150a16d8d 78cb38_72x72.png\”;s:3:\”url\”;s:287:\”mapi.juanpi/goods/zhe/list?catname=newest_zhe app_name=zhe platform=${jpPlatform} page=${page} app_version=${jpAppVersion} utm=${jpUtm} user_group=${jpUserGroup} ab_attr=${jpJpidAbAttr} goods_utype=${jpGoodsUtype} location=${jpLocation} sex=${jpFeature} fitperson=${fitperson}\”;s:9:\”show_type\”;s:1:\”3\”;s:7:\”top_img\”;s:52:\”/bao/170111/a/ 2/58765165db01d9f2738b45e7_156x132.png\”;s:8:\”sale_img\”;s:1:\”0\”;s:8:\”sel_type\”; s:1:\”2\”;s:7:\”ys_type\”;s:1:\”1\”;s:7:\”content\”;s:0:\”\”;s:3:\”cid\”;s:0:\”\”;s:4:\”type\”;s:1 :\”1\”;s:10:\”sale_act_p\”;s:0:\”\”;s:8:\”sale_d_p\”;s:0:\”\”;s:4:\”item\”;s:3:\”all\”;s:7:\”ys_ cate\”;s:1:\”1\”;s:7:\”item_id\”;s:3:\”317\”;s:11:\”multi_style\”;s:1:\”0\”;s:9:\”top_color\”;s :0:\”\”;s:6:\”search\”;s:1:\”1\”;s:7:\”keyword\”;s:12:\”秋季女装 \”;s:5:\”color\”;s:7:\”#999999\”;s:7:\”message\”;s:1:\”1\”;s:8:\”category\”;s:1:\”1\”;s:9:\”ca te_type\”;s:1:\”1\”;s:8:\”cate_url\”;s:0:\”\”;s:10:\”is_top_sub\”;s:1:\”0\”;s:11:\”use_keywor d\”;s:1:\”1\”;s:11:\”search_logo\”;s:50:\”/bao/170324/a/9/58d4bf07a43d1f6669251772_84 x42.png\”;}i:3;a:35:{s:2:\”id\”;s:1:\”3\”;s:5:\”title\”;s:12:\”卷皮优选

详解java序列化

我们可以通过序列化来保存一个对象的状态(实例变量)到文件中,也可以从这个格式化的文件中很容易地读取对象的状态从而可以恢复我们保存的对象。 用来实现序列化的类都在java.io包中,我们常用的类或接口有:ObjectOutputStream:提供序列化对象并把其写入流的方法 ObjectInputStream:读取流并反序列化对象 Serializable:一个对象想要被序列化,那么它的类就要实现此接口 下面我们先通过一个简单的例子演示一起序列化/反序列化的过程 Book.java package kevin.seria; import java.io.Serializable; public class Book implements Serializable{ private int isbn; public Book(int isbn) { super(); this.isbn = isbn; } public int getIsbn() { return isbn; } public void setIsbn(int isbn) { this.isbn = isbn; } @Override public String toString() { return"Book [isbn=" + isbn + "]"; } }

package kevin.seria; import java.io.Serializable; public class Student implements Serializable { private Book book; private String name; public Student(Book book, String name) { super(); this.book = book; https://www.360docs.net/doc/429248139.html, = name; } public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public String getName() { return name; } public void setName(String name) { https://www.360docs.net/doc/429248139.html, = name; } @Override public String toString() { return"Student [book=" + book + ", name=" + name + "]"; } }

JSON序列化与反序列化

方法一:引入System.Web.Script.Serialization命名空间使用JavaScriptSerializer类实现简单的序列化 序列化类:Personnel public class Personnel { public int Id { get; set; } public string Name { get; set; } } 执行序列化反序列化: 代码 protected void Page_Load(object sender, EventArgs e) { Personnel personnel = new Personnel(); personnel.Id = 1; https://www.360docs.net/doc/429248139.html, = "小白"; JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); //执行序列化 string r1 = jsonSerializer.Serialize(personnel); //执行反序列化 Personnel _Personnel = jsonSerializer.Deserialize(r1); } r1输出结果:{"Id":1,"Name":"小白"} 可以使用ScriptIgnore属性标记不序列化公共属性或公共字段。 public class Personnel { [ScriptIgnore] public int Id { get; set; } public string Name { get; set; } } r1输出结果:{"Name":"小白"} 方法二:引入System.Runtime.Serialization.Json命名空间使用DataContractJsonSerializer类实现序列化 序列化类:People public class People { public int Id { get; set; } public string Name { get; set; } } 执行序列化反序列化 代码

C#序列化详解

.net的运行时环境用来支持用户定义类型的流化的机制。它是将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。 序列化的目的: 1、以某种存储形式使自定义对象持久化; 2、将对象从一个地方传递到另一个地方。 实质上序列化机制是将类的值转化为一个一般的(即连续的)字节流,然后就可以将该流写到磁盘文件或任何其他流化目标上。而要想实际的写出这个流,就要使用那些实现了IFormatter接口的类里的Serialize和Deserialize方法。 在.net框架里提供了这样两个类: 一、BinaryFormatter BinaryFormatter使用二进制格式化程序进行序列化。您只需创建一个要使用的流和格式化程序的实例,然后调用格式化程序的Serialize方法。流和要序列化的对象实例作为参数提供给此调用。类中的所有成员变量(甚至标记为private的变量)都将被序列化。 NonSerializable属性用来明确表示类不能被序列化。

二SoapFormatter 前面我们用BinaryFormatter以二进制格式来序列化。很容易的我们就能把前面的例子改为用SoapFormatter的,这样将以xml格式化,因此能有更好的可移植性。所要做的更改只是将以上代码中的格式化程序换成SoapFormatter,而Serialize和Deserialize调用不变。对于上面使用的示例,该格式化程序将生成以下结果。

c# XML序列化与反序列化

c# XML序列化与反序列化 原先一直用BinaryFormatter来序列化挺好,可是最近发现在WinCE下是没有办法进行BinaryFormatter操作,很不爽,只能改成了BinaryWriter和BinaryReader来读写,突然想到能不能用XML来序列化?于是在网上查了些资料便写了些实践性代码,做些记录,避免以后忘记。 序列化对象 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { set; get; } [XmlElement("NUMBER")] public int Number { set; get; } } void Main(string[] args) { Student stu = new Student() { Age = 10, Class = "Class One", Name = "Tom", Number = 1 }; XmlSerializer ser = new XmlSerializer(typeof(Student)); ser.Serialize(File.Create("C:\\x.xml"), stu);

} 反序列化对象 XmlSerializer ser = new XmlSerializer(typeof(Student)); Student stu = ser.Deserialize(File.OpenRead("C:\\x.xml")) as Student; 对象数组序列化 public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { set; get; } [XmlElement("NUMBER")] public int Number { set; get; } } void Main(string[] args) { List stuList = new List(); stuList.Add(new Student() { Age = 10, Number = 1, Name = "Tom", Class = "Class One" }); stuList.Add(new Student() { Age = 11, Number = 2, Name = "Jay", Class = "Class Two" }); stuList.Add(new Student() { Age = 12, Number = 3, Name = "Pet", Class = "Class One" }); stuList.Add(new Student() { Age = 13, Number = 4, Name = "May", Class = "Class Three" }); stuList.Add(new Student() { Age = 14, Number = 5, Name = "Soy", Class = "Class

Json的序列化于反序列化

Json的序列化与反序列化: protected void Page_Load(object sender, EventArgs e) { Personnel personnel = new Personnel(); personnel.Id = 1; https://www.360docs.net/doc/429248139.html, = "小白"; JavaScriptSerializerjsonSerializer = new JavaScriptSerializer(); //执行序列化 string r1 = jsonSerializer.Serialize(personnel); //执行反序列化 Personnel _Personnel = jsonSerializer.Deserialize(r1); } r1输出结果:{"Id":1,"Name":"小白"} 可以使用ScriptIgnore属性标记不序列化公共属性或公共字段。 public class Personnel { [ScriptIgnore] public int Id { get; set; } public string Name { get; set; } } r1输出结果:{"Name":"小白"} 方法二: 引入System.Runtime.Serialization.Json命名空间使用DataContractJsonSerializer类实现序列化 序列化类:People [DataContractAttribute]//需要在类名中表明 public class People { [DataMemberAttribute]//需要在属性名中表明 publicint Id { get; set; } [DataMemberAttribute]//需要在属性名中表明 [DataMemberAttribute] public string Name { get; set; } }执行序列化反序列化 protected void Page_Load(object sender, EventArgs e) { People people = new People(); people.Id = 1; https://www.360docs.net/doc/429248139.html, = "小白"; DataContractJsonSerializerjson = new DataContractJsonSerializer(people.GetType()); string szJson = ""; //序列化 using (MemoryStream stream = new MemoryStream()) { json.WriteObject(stream, people);

c#序列化和反序列化的详细使用

序列化和反序列化C# [Serializable] 与[Serializable()] 这两个是一样的 这个标签是类可以被序列化的特性,表示这个类可以被序列化。 什么叫序列化? 我们都知道对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化,通俗点,就是把人的魂(对象)收伏成一个石子(可传输的介质) 什么叫反序列化? 就是再把介质中的东西还原成对象,把石子还原成人的过程。 在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。 通常网络程序为了传输安全才这么做。不知道回答清晰满意否? 下面进行验证 将Person的Name属性改成Private,然后查看生成的personInfo.text,其内容如下: < Person xmlns:xsi="https://www.360docs.net/doc/429248139.html,/2001/XMLSchema-instance" xmlns:xsd="https://www.360docs.net/doc/429248139.html,/2001/XMLSchema"> 200719 man 22 < /Person> 可以看到Name属性并没有出现在该文件中,反序列化生成的对象中Name属性值为NULL。 以上对c#序列化和反序列化的三种方式进行了举例说明。当然您也可以决定一个类中那些属性序列化或不序列化,可以通过使用NonSerialized 属性标记成员变量来防止它们被序列化,具体内容请查阅相关资料。 序列化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称(包括类所在的程序集)转换为字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。

序列化和反序列化

一、概述 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为对象。 把对象转换为字节序列的过程称为对象的序列化。 把字节序列恢复为对象的过程称为对象的反序列化。 二、对象的序列化主要有两种用途: 1)把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 我们经常需要将对象的字段值保存到磁盘中,并在以后检索此数据。尽管不使用序列化也能完成这项工作,但这种方法通常很繁琐而且容易出错,并且在需要跟踪对象的层次结构时,会变得越来越复杂。可以想象一下编写包含大量对象的大型业务应用程序的情形,程序员不得不为每一个对象编写代码,以便将字段和属性保存至磁盘以及从磁盘还原这些字段和属性。序列化提供了轻松实现这个目标的快捷方法。公共语言运行时(CLR) 管理对象在内存中的分布,.NET 框架则通过使用反射提供自动的序列化机制。对象序列化后,类的名称、程序集以及类实例的所有数据成员均被写入存储媒体中。对象通常用成员变量来存储对其他实例的引用。类序列化后,序列化引擎将跟踪所有已序列化的引用对象,以确保同一对象不被序列化多次。.NET 框架所提供的序列化体系结构可以自动正确处理对象图表和循环引用。对对象图表的唯一要求是,由正在进行序列化的对象所引用的所有对象都必须标记为Serializable(请参阅基本序列化)。否则,当序列化程序试图序列化未标记的对象时将会出现异常。当反序列化已序列化的类时,将重新创建该类,并自动还原所有数据成员的值。 2)在网络上传送对象的字节序列。 对象仅在创建对象的应用程序域中有效。除非对象是从MarshalByRefObject派生得到或标记为Serializable,否则,任何将对象作为参数传递或将其作为结果返回的尝试都将失败。如果对象标记为Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对象的一个精确副本。此过程通常称为按值封送。如果对象是从MarshalByRefObject派生得到,则从一个应用程序域传递至另一个应用程序域的是对象引用,而不是对象本身。也可以将从MarshalByRefObject派生得到的对象标记为Serializable。远程使用此对象时,负责进行序列化并已预先配置为SurrogateSelector的格式化程序将控制序列化过程,并用一个代理替换所有从MarshalByRefObject派生得到的对象。如果没有预先配置为SurrogateSelector,序列化体系结构将遵从下面的标准序列化规则. 三、.NET提供了三种序列化方式 [1]、XML Serializer [2]、SOAP Serializer [3]、BinarySerializer 四、基本序列化 要使一个类可序列化,最简单的方法是使用Serializable 属性对它进行标记,如下所示:[Serializable] public class MyObject { public int n1 = 0;

相关文档
最新文档