當前位置:首頁 » 合同協議 » 序列化協議

序列化協議

發布時間: 2021-03-16 11:26:31

『壹』 什麼是java序列化,如何實現java序列化

在java中只要一個類實現了Serializable介面的類就被認為是序列化的類,這種類的對象就是序列化的對象
只有被序列化的數據才允許被存儲到文件、資料庫之中或者通過網路協議進行傳輸,沒有被序列化的數據是不能存儲到硬碟上,不能通過網路協議進行網路傳輸

『貳』 如何選擇傳輸協議及格式

網路傳輸數據格式的選擇

對於客戶端和服務端的數據傳輸通常會有以下幾點考慮:
1.網路數據大小——佔用帶寬,傳輸效率:雖然對單個用戶來說,數據量傳輸很小,但是對於伺服器端要承受眾多的高並發數據傳輸,必須要考慮到數據佔用帶寬,盡量不要有冗餘數據,這樣才能夠少佔用帶寬,少佔用資源,少網路IO,提高傳輸效率;
2.網路數據安全性——敏感數據的網路安全:對於相關業務的部分數據傳輸都是敏感數據,所以必須考慮對部分傳輸數據進行加密;
3.編碼復雜度——序列化和反序列化復雜度,效率,數據結構的可擴展性,可維護性:對於平台相關業務的代碼實現也需要考慮到數據發送方和數據接收方數據處理的復雜度和數據結構的可擴展性,可維護性,人力成本和實施復雜度也必須考慮在內;
4.協議通用性——大眾規范:數據類型必須是跨平台,數據格式是通用的,大家普遍能接受上手的;
以下我們通過幾種不同類別的協議數據類型進行比較:
自定義二進制
優點:信息體積小,對應以上」1「
缺點:編碼復雜度高(自己定義消息格式,自己編寫序列化和反序列化方法,自己進行容錯處理,可擴展性不強,比如添加個欄位,就必須改兩端的邏輯處理),對應以上」3「;
提供序列化和反序列化庫的開源協議
比如protocol buffers, json, Thrift
優點:是一種流行的通用數據格式,擴展相當方便,序列化和反序列化相當方便(有相應庫),錯誤處理方便(庫支持);
文本化協議
比如xml,json
優點:序列化,反序列化容易(庫支持),調試方便,可視化強
缺點:相對於二進制存儲佔用體積大

如果是你,你會選擇哪種協議?
我會選擇json,因為他是「提供序列化和反序列化庫的開源協議還是文本化的協議」,原因如下:
1.自定義二進制格式進行傳輸的工作,整個過程在定義消息,write,read的過程過於復雜,還很容易出錯,對於很多數據交互的程序,會花費大量的時間在上面;

2.自定義二進制格式不便於擴展,但json可以很好地解決這種問題;

3.雖然相比較二進制,json的佔用空間稍大,但是我們可以通過網路數據壓縮來解決,況且json本身也是輕量級的,傳輸效率也很高;

4.去看《unix編程藝術》吧,第5章--文本化,好協議產生好實踐;第6章--透明性:來點兒光 會告訴你使用文本化協議的好處;

『叄』 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() ;
}
}

『肆』 關於Socket編程協議 能否直接傳序列化對象

把要寫進通道的類實現Serializable介面,利用ObjectInputStream和ObjectOutputStream對象流寫入和讀取就可以了。

從ObjectOutputStream里讀取的對象要強制轉換成需要的類。

『伍』 序列化和反序列化,怎麼保證數據的正確性

Java序列化與反序列化是什麼?為什麼需要序列化與反序列化?如何實現Java序列化與反序列化?本文圍繞這些問題進行了探討。
1.Java序列化與反序列化
Java序列化是指把Java對象轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java對象的過程。
2.為什麼需要序列化與反序列化
我們知道,當兩個進程進行遠程通信時,可以相互發送各種類型的數據,包括文本、圖片、音頻、視頻等, 而這些數據都會以二進制序列的形式在網路上傳送。那麼當兩個Java進程進行通信時,能否實現進程間的對象傳送呢?答案是可以的。如何做到呢?這就需要Java序列化與反序列化了。換句話說,一方面,發送方需要把這個Java對象轉換為位元組序列,然後在網路上傳送;另一方面,接收方需要從位元組序列中恢復出Java對象。
當我們明晰了為什麼需要Java序列化和反序列化後,我們很自然地會想Java序列化的好處。其好處一是實現了數據的持久化,通過序列化可以把數據永久地保存到硬碟上(通常存放在文件里),二是,利用序列化實現遠程通信,即在網路上傳送對象的位元組序列。
3.如何實現Java序列化與反序列化
1)JDK類庫中序列化API
java.io.ObjectOutputStream:表示對象輸出流
它的writeObject(Object obj)方法可以對參數指定的obj對象進行序列化,把得到的位元組序列寫到一個目標輸出流中。
java.io.ObjectInputStream:表示對象輸入流
它的readObject()方法源輸入流中讀取位元組序列,再把它們反序列化成為一個對象,並將其返回。
2)實現序列化的要求
只有實現了Serializable或Externalizable介面的類的對象才能被序列化,否則拋出異常。
3)實現Java對象序列化與反序列化的方法
假定一個Student類,它的對象需要序列化,可以有如下三種方法:
方法一:若Student類僅僅實現了Serializable介面,則可以按照以下方式進行序列化和反序列化
ObjectOutputStream採用默認的序列化方式,對Student對象的非transient的實例變數進行序列化。
ObjcetInputStream採用默認的反序列化方式,對對Student對象的非transient的實例變數進行反序列化。
方法二:若Student類僅僅實現了Serializable介面,並且還定義了readObject(ObjectInputStream in)和writeObject(ObjectOutputSteam out),則採用以下方式進行序列化與反序列化。
ObjectOutputStream調用Student對象的writeObject(ObjectOutputStream out)的方法進行序列化。
ObjectInputStream會調用Student對象的readObject(ObjectInputStream in)的方法進行反序列化。
方法三:若Student類實現了Externalnalizable介面,且Student類必須實現readExternal(ObjectInput in)和writeExternal(ObjectOutput out)方法,則按照以下方式進行序列化與反序列化。
ObjectOutputStream調用Student對象的writeExternal(ObjectOutput out))的方法進行序列化。
ObjectInputStream會調用Student對象的readExternal(ObjectInput in)的方法進行反序列化。
4)JDK類庫中序列化的步驟
步驟一:創建一個對象輸出流,它可以包裝一個其它類型的目標輸出流,如文件輸出流:
ObjectOutputStream out = new ObjectOutputStream(new fileOutputStream(「D:\\objectfile.obj」));
步驟二:通過對象輸出流的writeObject()方法寫對象:
out.writeObject(「Hello」);
out.writeObject(new Date());
5)JDK類庫中反序列化的步驟
步驟一:創建一個對象輸入流,它可以包裝一個其它類型輸入流,如文件輸入流:
ObjectInputStream in = new ObjectInputStream(new fileInputStream(「D:\\objectfile.obj」));
步驟二:通過對象輸出流的readObject()方法讀取對象:
String obj1 = (String)in.readObject();
Date obj2 = (Date)in.readObject();
說明:為了正確讀取數據,完成反序列化,必須保證向對象輸出流寫對象的順序與從對象輸入流中讀對象的順序一致。
為了更好地理解Java序列化與反序列化,選擇方法一編碼實現。
Student類定義如下:
[java] view plain
package com.jieke.io;
import java.io.Serializable;

/**
*Title:學生類
*Description:實現序列化介面的學生類
*Copyright: right(c) 2012
*Filename: Student.java
*@author Wang Luqing
*@version 1.0
*/
public class Student implements Serializable
{
private String name;
private char sex;
private int year;
private double gpa;

public Student()
{

}
public Student(String name,char sex,int year,double gpa)
{
this.name = name;
this.sex = sex;
this.year = year;
this.gpa = gpa;
}

public void setName(String name)
{
this.name = name;
}

public void setSex(char sex)
{
this.sex = sex;
}

public void setYear(int year)
{
this.year = year;
}

public void setGpa(double gpa)
{
this.gpa = gpa;
}

public String getName()
{
return this.name;
}

public char getSex()
{
return this.sex;
}

public int getYear()
{
return this.year;
}

public double getGpa()
{
return this.gpa;
}
}
把Student類的對象序列化到文件O:\\Java\\com\\jieke\\io\\student.txt,並從該文件中反序列化,向console顯示結果。代碼如下:
[java] view plain
import java.io.*;

/**
*Title:應用學生類
*Description:實現學生類實例的序列化與反序列化
*Copyright: right(c) 2012
*Filename: UseStudent.java
*@author Wang Luqing
*@version 1.0
*/

public class UseStudent
{
public static void main(String[] args)
{
Student st = new Student("Tom",'M',20,3.6);
File file = new File("O:\\Java\\com\\jieke\\io\\student.txt");
try
{
file.createNewFile();
}
catch(IOException e)
{
e.printStackTrace();
}
try
{
//Student對象序列化過程
FileOutputStream fos = new FileOutputStream(file);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(st);
oos.flush();
oos.close();
fos.close();

//Student對象反序列化過程
FileInputStream fis = new FileInputStream(file);
ObjectInputStream ois = new ObjectInputStream(fis);
Student st1 = (Student) ois.readObject();
System.out.println("name = " + st1.getName());
System.out.println("sex = " + st1.getSex());
System.out.println("year = " + st1.getYear());
System.out.println("gpa = " + st1.getGpa());
ois.close();
fis.close();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
結果如下所示:
name = Tom
sex = M
year = 20
gpa = 3.6
總結:
1)Java序列化就是把對象轉換成位元組序列,而Java反序列化就是把位元組序列還原成Java對象。
2)採用Java序列化與反序列化技術,一是可以實現數據的持久化,在MVC模式中很是有用;二是可以對象數據的遠程通信。

『陸』 javascript什麼是序列化

一.什麼是對象序列化?

對象序列化是指將對象的狀態轉換為字元串(來自我這菜鳥的理解,好像有些書上也是這么說的,淺顯易懂!);

序列化(Serialization)是將對象的狀態信息轉換為可以存儲或傳輸的形式的過程(來自「網路—序列化「,學術性強,略顯高端);

二.為什麼會有對象序列化?

世間萬物,都有其存在的原因。為什麼會有對象序列化呢?因為程序猿們需要它。既然是對象序列化,那我們就先從一個對象說起:

varobj={x:1,y:2};


當這句代碼運行時,對象obj的內容會存儲在一塊內存中,而obj本身存儲的只是這塊內存的地址的映射而已。簡單的說,對象obj就是我們的程序在電腦通電時在內存中維護的一種東西,如果我們程序停止了或者電腦斷電了,對象obj將不復存在。那麼如何把對象obj的內容保存在磁碟上呢(也就是說在沒電時繼續保留著)?這時就需要把對象obj序列化,也就是說把obj的內容轉換成一個字元串的形式,然後再保存在磁碟上。另外,我們又怎麼通過HTTP協議把對象obj的內容發送到客戶端呢?沒錯,還是需要先把對象obj序列化,然後客戶端根據接收到的字元串再反序列化(也就是將字元串還原為對象)解析出相應的對象。這也正是」網路—序列化「中描述的兩個作用——存儲、傳輸。

三.JavaScript中的對象序列化

JSON的全稱是」JavaScriptObjectNotation「——JavaScript對象表示法。ECMAScript5中提供了內置函數JSON.stringify()和JSON.parse()用來序列化和還原JavaScript對象。它們使用起來也很簡單:

可以看到,exampleStr和exampleObj2中並沒有y:undefined的內容。這說明:JSON的語法是JavaScript語法的子集,它並不能表示JavaScript中的所有值,對於JSON語法不支持的屬性,序列化後會將其省略。其詳細規則如下:

①對於JavaScript中的五種原始類型,JSON語法支持數字、字元串、布爾值、null四種,不支持undefined;

②NaN、Infinity和-Infinity序列化的結果是null;

③JSON語法不支持函數;

④除了RegExp、Error對象,JSON語法支持其他所有對象;

⑤日期對象序列化的結果是ISO格式的字元串,但JSON.parse()依然保留它們字元串形態,並不會將其還原為日期對象;

⑥JSON.stringify()只能序列化對象的可枚舉的自有屬性;

從上面的例子也可以看到,在符合以上規則的情況下,還可以通過對象序列化和反序列化完成對象的深拷貝(什麼是對象的深拷貝?可以去看:https://www.hu.com/question/23031215,鄒潤陽的答案)。

以上就是JSON.stringify()和JSON.parse()的常用用法了,但這兩個方法並不止這么簡單:

四.完整版JSON.stringify()

1.簡介

序列化原始值、對象或數組

2.概要

JSON.stringify(o[,filter][,indent])

3.參數

o,要轉換成JSON字元串的原始值、對象或數組

filter,可選參數,一個數組或函數

indent,可選參數,一個數值或一個字元串

4.返回

JSON格式的字元串,代表o的值,同時通過了filter的過濾,以及根據indent進行了格式化

5.描述

①當對象o自身帶有toJSON()方法時,JSON.stringify()會調用o的toJSON()方法,並使用該方法的返回值而不是該對象本身進行字元串化;

②如果filter存在且是一個函數,那麼該函數的返回值將會作為JSON.stringify()方法的返回值。並且該函數接收兩個參數,第一個參數是一個空字元串,第二個參數就是對象o。這里,大家也可以參考DouglasCrockford為ES3環境使用JSON寫的json2:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L427。看看JSON.stringify和str的實現應該就明白我這里所說的這兩個參數的具體含義了;

③如果filter存在且是一個字元串數組(如果數組中包含數字,數字會自動轉化為字元串),那麼對象o的某些屬性名如果不在這個數組中,則序列化時會將這些屬性省略,且返回的字元串中屬性的順序會與該數組中屬性的順序一致;

④JSON.stringify()返回的通常是不帶任何空格或換行符的字元串。如果想輸出可讀性更好的字元串,需要指定第三個參數。如果指定的第三個參數是介於1~10之間的值,則JSON.stringify()會在每一「層級」的輸出插入換行符和指定個數的空格。如果指定的第三個參數是非空字元串,則JSON.stringify()會插入換行符和該字元串(只取前十個字元)來縮進層級;

五.完整版JSON.parse()

1.簡介

解析JSON格式的字元串

2.概要

JSON.parse(s[,reviver])

3.參數

s,要解析的字元串

reviver,可選參數,用來轉換解析值的可選函數

4.返回

一個對象、數組或原始值。該返回值是從s中解析的(還有可能被reviver修改過);

5.描述

①如果指定了reviver函數,該函數會為從s中解析的每一個原始值(不是包含這些原始值的對象或數組)調用一次。調用reviver時帶有兩個參數,第一個參數是屬性名——對象的屬性名或轉換成字元串的數組序號,第二個參數是對象屬性或數組元素的原始值(如果對於這里說的兩個參數有疑惑,還是可以參考:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L460)。並且,reviver函數的返回值將作為JSON.parse()的返回值;

『柒』 protocol buffer怎麼序列化

Protocol Buffer(文簡稱protobuf)Google提供種數據序列化協議面我網找Google官protobuf定義:
Protocol Buffers 種輕便高效結構化數據存儲格式用於結構化數據序列化適合做數據存儲或 RPC 數據交換格式用於通訊協議、數據存儲等領域語言關、平台關、擴展序列化結構數據格式目前提供 C++、Java、Python 三種語言 API

『捌』 序列化主要起什麼作用 一般在什麼時候用

主要是將內存中的數據組織成為一個或一組可見的數據流。我們常見的有xml序列化和二進制序列化。

而在應用方面,webService就使用的是xml序列化,它將需要進行網路傳輸的數據信息轉化成為具有指定架構(XSD)格式的xml(WSDL),並使用指定的傳輸協議進行數據傳輸。

對於二進制序列化,應用的地方也很多,例如許多需要臨時保存的內容,而又不需要使用資料庫時,我們可以將內存中的對象保存到文件系統中,這時就需要進行二進制序列化。最常見的應用就是我們玩游戲時的保存記錄。

『玖』 怎樣做才能讓Java 序列化機制 更安全

Java 序列化 serialization主要職責就是將一個對象的狀態轉化為一個位元組序列,以方便對象的持久化或網路傳輸。反序列化的過程正好相反。開發人員所要做的只是實現Serializable介面,然後調用ObjectOutputStream/ObjectInputStream的WriteObject/ReadObject方法即可,其他的工作 JVM會自動幫你做了。
那通過實現Serializable 介面所獲取的序列化能力是否有安全隱患?由於這些位元組序列已經脫離了Java的安全體系存在於磁碟或網路上,我們能否對序列化後的位元組序列進行查看和修改,甚至於注入惡意病毒呢? Java 反序列化機制是否又會對建立的對象進行驗證以確保它的安全性、准確性呢? 如果你想到這些問題,那恐怕答案會讓你失望了。Java序列化後的位元組序列基本都是明文存在的,而且位元組序列的組成有很明確的文檔進行說明,你可以試著用一些十六進制的文本編輯工具,如Hexeditor 查看一下對象序列化後的內容,你都能看到很多私有變數的實際賦值。關於位元組序列的說明,可參考對象序列化流協議 ,這里就不多說了。這篇文章的重點是說一些Java提供的安全機制,通過這些機制,我們能夠提升序列化/反序列化的安全指數。

熱點內容
美發店認證 發布:2021-03-16 21:43:38 瀏覽:443
物業糾紛原因 發布:2021-03-16 21:42:46 瀏覽:474
全國著名不孕不育醫院 發布:2021-03-16 21:42:24 瀏覽:679
知名明星確診 發布:2021-03-16 21:42:04 瀏覽:14
ipad大專有用嗎 發布:2021-03-16 21:40:58 瀏覽:670
公務員協議班值得嗎 發布:2021-03-16 21:40:00 瀏覽:21
知名書店品牌 發布:2021-03-16 21:39:09 瀏覽:949
q雷授權碼在哪裡買 發布:2021-03-16 21:38:44 瀏覽:852
圖書天貓轉讓 發布:2021-03-16 21:38:26 瀏覽:707
寶寶水杯品牌 發布:2021-03-16 21:35:56 瀏覽:837