Unmarshalling (計算機科學)

unmarshalling,或譯作「解集」,是計算機科學中把已經變換為適合於存儲或傳輸對象的表示,變換為可執行的對象表示的過程。一個unmarshalling接口把序列化對象變換為可執行形式。Unmarshallingmarshalling的逆過程。

用途

編輯

通常,進程間通信時,需要發送XML對象。接收到數據的進程需要把它轉化回可執行對象以便使用。因此unmarshalling通常用於Java遠程方法調用(RMI)與遠程過程調用(RPC)機制實現的接收端以把傳送的對象轉化為可執行形式。

JAXBJava語言架構的XML數據綁定英語XML data binding是最常用的架構,實現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;反之不然。

參見

編輯

參考文獻

編輯
  1. ^ Binding XML Schemas - The Java EE 5 Tutorial. docs.oracle.com. [2016-09-14]. (原始內容存檔於2022-01-29). 
  2. ^ Using the XmlSerializer Class. msdn.microsoft.com. [2016-09-23]. (原始內容存檔於2016-09-23). 
  3. ^ 3.0 3.1 Unmarshaller (JAXB 2.2.3). jaxb.java.net. [2016-09-14]. (原始內容存檔於2012-06-05). 
  4. ^ JAXBContext (JAXB 2.2.3). jaxb.java.net. [2016-09-23]. (原始內容存檔於2016-09-27). 
  5. ^ JAXBElement (JAXB 2.2.3). jaxb.java.net. [2016-09-23]. (原始內容存檔於2013-02-16).