序列化与反序列化
来源:互联网 发布:js封装对象 编辑:程序博客网 时间:2024/06/10 23:17
序列化(serialization)是将对象的状态信息转换为可以存储或传输的窗体的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
下面用fastjson完成序列化与反序列化的一个例子:
要被序列化和反序列化的对象Person:
public class Person {private String name;private int age;/* * 对于下面的第二个例子,此空构造器必要,否则: com.alibaba.fastjson.JSONException: * default constructor not found. class com.test.Person */public Person() {}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;}}
下面实测序列化与反序列化结果:
import com.alibaba.fastjson.JSON;public class Serialization {public static void main(String[] args) {Person person = new Person("XiaoMing", 16);//序列化String text = JSON.toJSONString(person);System.out.println(text);//反序列化Person person1 = JSON.parseObject(text, Person.class);System.out.println(person1.getName()+","+person1.getAge());}}结果:
{"age":16,"name":"XiaoMing"}
XiaoMing,16
如果在Person中加入另一个public类型的域变量(如public int ok;)或get方法(如public int getOk(){return 88},最终都会被序列化:
分别为:{"age":16,"name":"XiaoMing","ok":0} 、{"age":16,"name":"XiaoMing","ok":88}
要想不被序列化可加关键字transient,顾名思义就是不持久化,如publictransient ok = 99; ok字段将不会被序列化。
对于List的序列化与反序列化:
public class People {private String id;private List<Person> list = new ArrayList<Person>();public String getId() {return id;}public void setId(String id) {this.id = id;}public List<Person> getList() {return list;}public void setList(List<Person> list) {this.list = list;}}
import com.alibaba.fastjson.JSON;public class SerializationList {public static void main(String[] args) {People people = new People();people.setId("10012");Person p1 = new Person("XiaoMing", 16);Person p2 = new Person("XiaoFang", 15);List<Person> list = new ArrayList<Person>();list.add(p1);list.add(p2);people.setList(list);// 序列化String text = JSON.toJSONString(people);System.out.println(text);// 反序列化People p = JSON.parseObject(text, People.class);System.out.println(p.getId());for(Person person : p.getList()){System.out.println(person.getName()+","+person.getAge());}}}结果:
{"id":"10012","list":[{"age":16,"name":"XiaoMing"},{"age":15,"name":"XiaoFang"}]}
10012
XiaoMing,16
XiaoFang,15
拼装json串:
JSONArray jArr = new JSONArray();nameSet = contactMap.keySet();for (String name : nameSet) { JSONObject jobj = new JSONObject(); jobj.put("name", name); jobj.put("phone", contactMap.get(name)); jArr.add(jobj);}String jsonStr = jArr.toJSONString();
System.out.print(jsonStr);
[{"name":"张三","phone":"13611112222"},{"name":"李四","phone":"13733334444"}]
注意,对于极端情况,如下:
public class Ruler {
public String name;
public int len;
}
String rawJson1 = "{}";
String rawJson2 = "{'list':[]}";
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
JSONObject jobj = JSON.parseObject(rawJson1);
Iterator<Object> it = jobj.values().iterator();
==>it.hasNext() == false
Ruler ruler = JSON.parseObject(rawJson1, Ruler.class);
==>ruler.name==null, ruler.len==0
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
JSONObject jobj = JSON.parseObject(rawJson2);
JSONArray jArr = jobj .getJSONArray("list");
List<Ruler> rulers = (List<Ruler>) JSONArray.parseArray(jArr.toJSONString(), Ruler.class);
==>rulers.size()==0
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
JSON.toJSONString(new Object())==>{}
JSON.toJSONString(new ArrayList())==>[]
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
- 序列化与反序列
- 序列化与反序列
- XML序列化与反序列化
- 对象序列化与反序列化
- 序列化与反序列化
- 转载:序列化与反序列化
- c#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 序列化与反序列化
- 序列化与反序列化
- C#序列化与反序列化
- java序列化与反序列化
- XML序列化与反序列化
- 再看序列化与反序列化
- 序列化与反序列化对象
- 序列化与反序列化
- .NET序列化与反序列化
- Unique Paths
- easu ui 下拉框选择某项时打开对应的网页 onSelect() window.onen()
- CSS浏览器兼容问题集(一)
- java控制台实现QQ聊天程序
- matlab unique函数
- 序列化与反序列化
- 云存储加速
- RDBMS 数据库补丁集补丁号码快速参考-文档 ID 1577380.1
- CSS浏览器兼容问题集(二)
- Linux dup2详解
- Centering text in a table in Twitter Bootstrap
- 专业程序员必知必会的技巧:驯服复杂代码
- CSS浏览器兼容问题集 (三)
- UI 文本大小(长,宽)的设置