1. 为什么socket传输对象的时候要将对象序列化
将对象存入文件或者数据库叫做持久化。在持久化前需要先序列化。序列化的含义就是将层次的数据(一个对象包含很对字段,如果字段本身是对象,它还有它的字段,这个结构类似一颗树)变成扁平的,序列的数据。
无论是写文件还是网络传输,都必须将数据变成一串,或者说一个序列,这就是序列化的含义。
2. 什么是序列化常见的序列化框架有哪些各有何特点
序列化是可以使一个对象成功转化为另一个对象的过程,比如,你定义一个对象,使他可以在网上传输,就需要转化成xml或是json 等格式,就时就需要对象是可以被序列化的
3. 如何使用kryo作为序列化的传输方式
可以
<bbo:protocol name="bbo" serialization="kryo" optimizer="xxxx.SerializationOptimizerImpl"/>
public class SerializationOptimizerImpl implements SerializationOptimizer {
public Collection<Class> getSerializableClasses() {
List<Class> classes = new LinkedList<Class>();
classes.add(BidRequest.class);
classes.add(BidResponse.class);
classes.add(Device.class);
classes.add(Geo.class);
classes.add(Impression.class);
classes.add(SeatBid.class);
classes.add(User.class);
return classes;
}
}
4. 序列化和反序列化有几种方式分别是什么
截止至.NET 4.0总共有如下若干个序列化类
1.xml序列化 XmlSerializer
2.二进制序列化 BinaryFormatter
3.Soap序列化 SoapFormatter
4.WCF序列化 DataContractSerializer
5.Json序列化 DataContractJsonSerializer和JavascriptSerializer
5. 什么是序列化
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
6. 为什么网络传输时对象要序列化,而字符串就不用序列化
网络传输会将对象转换成字节流传输,序列化可以将一个对象转化成一段字符串编码,以便在网络上传输或者做存储处理,使用时再进行反序列,而字符串不用序列化的原因是如果你看过javaSE的源码,你就知道,字符串是已经实现了Serializable接口的,所以它已经是序列化了的
7. 什么是序列化,在java中如何实现序列化
一、什么是序列化:
序列化理解成“打碎”是可以的,不过在书本上的名词就是将对象转换成二进制。
二、在java中如何实现序列化:
首先我们要把准备要序列化类,实现 Serializabel接口
例如:我们要Person类里的name和age都序列化
import java.io.Serializable;
public class Person implements Serializable { //本类可以序列化
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:" + this.name + ",年龄" + this.age ;
}
}
然后:我们将name和age序列化(也就是把这2个对象转为二进制,统族理解为“打碎”)
package org.lxh.SerDemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream ;
public class ObjectOutputStreamDemo { //序列化
public static void main(String[] args) throws Exception {
//序列化后生成指定文件路径
File file = new File("D:" + File.separator + "person.ser") ; ObjectOutputStream oos = null ;
//装饰流(流)
oos = new ObjectOutputStream(new FileOutputStream(file)) ;
//实例化类
Person per = new Person("张三",30) ; oos.writeObject(per) ;//把类对象序列化
oos.close() ;
}
}
8. 为什么在网上传输的对象必须实现serialization接口
这哪来为什么!
java规范中说要写入文件或是通过网络传输的对象必须是可序列化的!
所以弄个标志接口Serializable 来标识一个类可以被序列化
如果所有的类都可以被序列化是会出问题的!比如说某个类你序列化到你的磁盘了,但是经过时间的推移,需求增加了,你需要改变这个序列化的类的一些属性,这时候那个存储到文件中的对象就反序列化不回来了。。。
9. socket传输中,java的对象序列化和反序列化过程中是如何确保数据的完整性的
·ObjectInputStream和ObjectOutputStream这两个包装类,用于从底层输入流中读取对象类型的数据和对象类型的数据写入到底层输出流。将对象中所有成员变量的取值保存起来就等于保存了对象,将对象中所有成员变量的取值还原就相等于读取了对象。
·ObjectInputStream和ObjectOutputStream类所读写的对象必须实现了Serializable接口。对象中的transient(一种标记,表示变量是临时的)和static类型的成员变量不会被读取和写入。这两个类可以用于网络流中传送对象。
( transient:java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用 serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。)
·一个可以被序列化的MyClass类的定义:
public class MyClass implements Serializable{
public transient Thread t; //t不会被序列化
private String customerID;
private int total;
}
·编程举例:创建一个可序列化的学生对象,并用ObjectOutputStream类把它存储到一个文件(mytext.txt)中,然后再用ObjectInputStream类把存储的数据读取到一个学生对象中,即恢复保存的学生对象。
[java] view plain
import java.io.*;
class Student implements Serializable //必须实现Serializable接口才能序列化
{
int age;
String name;
Student(int age, String name){
this.age = age;
this.name = name;
}
}
public class Iotest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student stu1 = new Student(20,"zhangsan");
Student stu2 = new Student(22,"lisi");
try {
FileOutputStream fos = new FileOutputStream("a.txt");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(stu1);
oos.writeObject(stu2);
oos.close();
FileInputStream fis = new FileInputStream("a.txt");
ObjectInputStream ois = new ObjectInputStream(fis);
Student stu3 = (Student) ois.readObject();
System.out.println("age: "+stu3.age);
System.out.println("name: "+stu3.name);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
10. 将数据序列化有什么作用啊
序列化是什么:
序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。
序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例。
序列化有什么特点:
如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。
什么时候使用序列化:
一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。
二:对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。