Unmarshalling (計算機科學)
unmarshalling,或譯作「解集」,是計算機科學中把已經變換為適合於存儲或傳輸的對象的表示,變換為可執行的對象表示的過程。一個unmarshalling接口把序列化對象變換為可執行形式。Unmarshalling是marshalling的逆過程。
用途
通常,進程間通信時,需要發送XML對象。接收到數據的進程需要把它轉化回可執行對象以便使用。因此unmarshalling通常用於Java遠程方法調用(RMI)與遠程過程調用(RPC)機制實現的接收端以把傳送的對象轉化為可執行形式。
JAXB
JAXB或Java語言架構的XML數據綁定是最常用的架構,實現marshal與unmarshal Java對象。JAXB提供了在Java的基本數據類型與XML schema標準支持的數據類型之間的相互轉化。[1]
XmlSerializer
XmlSerializer是C#實現marshal與unmarshal C#對象的框架。由於包含XmlSerializer類,C#本地支持marshalling。[2]
XML與可執行程序的表示
Unmarshalling的一個例子是把一個對象的XML表示轉化為該對象在任何程式語言的默認可執行的表示。例如,下述類:
public class Student
{
private char name[50];
private int ID;
public String getName()
{
return this.name;
}
public int getID()
{
return this.ID;
}
void setName(String name)
{
this.name = name;
}
void setID(int ID)
{
this.ID = ID;
}
}
- Student對象的XML表示:
<!-- Code Snippet: 1 -->
<?xml version = “1.0” encoding = “UTF-8”?>
<student id = “11235813”>
<name>Jayaraman</name>
</student>
<student id = “21345589”>
<name>Shyam</name>
</student>
- Student對象的可執行表示:
//Code Snippet: 2
Student s1 = new Student();
s1.setID(11235813);
s1.setName(“Jayaraman”);
Student s2 = new Student();
s2.setID(21345589);
s2.setName(“Shyam”);
從對象的XML表示(在代碼片段1中)到Java默認的可執行表示(在代碼片段2中)的轉換過程稱為unmarshalling。
JAXB的Unmarshaller
對象的XML表示到Java默認的可執行表示的轉換過程,由內建的Unmarshaller類負責。同時也驗證了收到的XML的有效性。Unmarshaller類中的unmarshal方法對不同類型的XML輸入是重載的。一些比較重要的unmarshal方法的實現有:[3]
- 從XML文件Unmarshalling:
JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller umar = jcon.createUnmarshaller();
Object obj = umar.unmarshal( new File( "input.xml" ) );
- 從一個XML文件作為輸入流中Unmarshalling:
InputStream istr = new FileInputStream( "input.xml" );
JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller umar = jcon.createUnmarshaller();
Object obj = umar.unmarshal( istr );
- 從一個來自於URL的XML文件中Unmarshalling:
JAXBContext jcon = JAXBContext.newInstance( "com.acme.foo" );
Unmarshaller umar = jcon.createUnmarshaller();
URL url = new URL( "http://merrilllynch.employee/input.xml" );
Object obj = umar.unmarshal( url );
XML數據的Unmarshalling
Unmarshal方法可以反序列化(deserialize)整個XML文檔或者它的一部分。
Unmarshal一個全局XML根元素
當XML根元素被全局聲明,這些方法利用JAXBContext把XML根元素映射為JAXB的映射類以初始化unmarshalling。JAXBContext對象總是維護全局聲明的XML元素到JAXB映射類名字之間的映射。如果XML元素名字或它的@xsi:type
屬性匹配JAXB映射類,unmarshal方法把XML數據變換為合適的JAXB映射類。但是如果XML元素名字不匹配,unmarshal過程將abort並拋出UnmarshalException。可用declaredType參數unmarshal以避免這種異常。[4]
Unmarshal一個局部XML根元素
如果映射不是充分的且根元素被局部聲明,unmarshal方法是用應用程式提供的declaredType參數來unmarshalling過程。[3]根據優先次序,即使根名字映射到一個合適的JAXB類,declaredType能覆蓋這個映射。但是如果XML數據的@xsi:type
屬性映射到合適的JAXB類,將優先於declaredType參數。有declaredType參數的Unmarshal方法總是返回JAXBElement<declaredType>
實例。該JAXBElement實例屬性總是如下設置:[5]
JAXBElement屬性 | 值 |
---|---|
name | xml屬性名字 |
value | instanceof declaredType |
declaredType | unmarshal方法的declaredType參數 |
scope | null(實際尺寸未知) |
與反序列化的對比
對象的序列化是把它表示為字節流;反序列化是轉化為最初對象的副本。
對象被marshalled是從最初的內存狀態與所包含的codebase記錄下來;unmarshaller接口自動轉化被marshalled的數據為Java在JAXB中可執行的代碼。可被反序列化的對象就可被unmarshalled;反之不然。
參見
參考文獻
- ^ Binding XML Schemas - The Java EE 5 Tutorial. docs.oracle.com. [2016-09-14]. (原始內容存檔於2022-01-29).
- ^ Using the XmlSerializer Class. msdn.microsoft.com. [2016-09-23]. (原始內容存檔於2016-09-23).
- ^ 3.0 3.1 Unmarshaller (JAXB 2.2.3). jaxb.java.net. [2016-09-14]. (原始內容存檔於2012-06-05).
- ^ JAXBContext (JAXB 2.2.3). jaxb.java.net. [2016-09-23]. (原始內容存檔於2016-09-27).
- ^ JAXBElement (JAXB 2.2.3). jaxb.java.net. [2016-09-23]. (原始內容存檔於2013-02-16).