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要利用對象序列化運行遠程主機上的服務,就像在本地機上運行對象時一樣。
二:對象序列化不僅保留一個對象的數據,而且遞歸保存對象引用的每個對象的數據。可以將整個對象層次寫入位元組流中,可以保存在文件中或在網路連接上傳遞。利用對象序列化可以進行對象的"深復制",即復制對象本身及引用的對象本身。序列化一個對象可能得到整個對象序列。