Buffalo协议

在Buffalo2.0之前,Buffalo使用caucho的burlap协议。从2.0开始,Buffalo有了一个全新的协议定义和适合web的、更快速的实现。Buffalo采用这个基于xml的轻量级协议来序列化java对象。而javascript客户端把xml反序列化为javascript对象。当进行一次远程调用时,Buffalo客户端会把这个远程调用序列化为xml,然后java端(服务器端)进行反序列化。本文档涵盖了此协议规范。

协议概述

    Buffalo协议是一个"utf-8"协议。即xml仅支持uft-8编码,否则在解析过程中将抛出ProtocolExcption异常。

标记 描述 被映射为java类 被映射为javascript类
boolean 布尔值,1表示true;0表示false java.lang.Boolean , boolean.class boolean
date 日期,ISO8609 格式,比如20061011T230201Z代表了Oct 11 2006, 23:02:01 java.util.Date Date
int 整型数值 java.lang.Integer, java.lang.Short, java.lang.Byte以及它们的原始类型(primitive types) int
long 长整型数值 java.lang.Long和它的原始类型 int
null null值 null null or undefined
string 字符串 java.lang.String, java.lang.Character, char.class String
type 用于标识list或者map的类型 N/A N/A
length 用于标识list的长度 N/A N/A
list list或者数组(array)数据结构 java.util.Collection的子类或者数组 Array
map map或者object数据结构 java.util.Map的子类或者java bean object
double double java.lang.Double, java.lang.Float以及它们的原始类型 float
ref 对象引用 N/A N/A
fault 异常 在客户端的异常将不被转换,因为来自客户端的异常没有意义 Buffalo.Fault
buffalo-call 客户端远程调用的根成员(root element) N/A N/A
method 客户端调用的方法 N/A N/A
buffalo-reply 服务器回应的根成员 N/A N/A

    从客户端发送到服务器的Buffalo请求示例:

<buffalo-call>
  <method>sum</method>
  <double>1</double>
  <double>2</double>
</buffalo-call>

    服务器回应示例:

<buffalo-reply>
  <double>3.0</double>
</buffalo-call>

list

    数组或者java.util.Collection的子类将被转换为list。(来源 www.iocblog.net)
    对于java.util.Collection的子类------List类:

List list = new ArrayList();
list.add("String#1");
list.add("String#2");

    它被序列化为以下的xml片断:

<list>
  <type>java.util.ArrayList</type>
  <length>2</length>
  <string>String#1</string>
  <string>String#2</string>
</list>

    对于数组:

String[] strings = new String[]{"String#1", "String#2"}

    它被序列化为以下的xml片断:

<list>
  <type>[java.lang.String</type>
  <length>2</length>
  <string>String#1</string>
  <string>String#2</string>
</list>

map

    map标识一个类似map的数据结构。java.util.Map的子类或者POJO将使用此标记。

   对于java.util.Map的子类:

Map map = new HashMap()
map.put("key1", "value1");
map.put(new Integer(1), new Double(2.0));

    它被序列化为以下的xml片断:

<map>
  <type>java.util.HashMap</type>
  <string>key1</string>
  <string>value1</string>
  <int>1</int>
  <double>2.0</double>
</map>

   对于POJO:

package domain;
class User {
  String name;
  int age;
  boolean gendor;

  //getters & setters...
}

User u = new User("John Smith", 30, true);

   它被序列化为以下的xml片断:

<map>
  <type>domain.User</type>
  <string>name</string>
  <string>John Smith</string>
  <string>age</string>
  <int>age</int>
  <string>gendor</string>
  <boolean>1</boolean>
</map>

ref

   <ref>表示对另一个对象的引用。这个标记对于处理循环引用的场合非常有用,而其它场合会抛出StackOverflowException异常。来让我们看一下示例:

/*People类定义*/
class People{
  ...
  People getFriend() ...
  // Other fields ommited
}

/*People类对象的使用*/
People john = new People("John");
People michael = new People("Michael");
//这里演示了循环引用
john.setFriend(michael);
michael.setFriend(josh);

List friends = new ArrayList();
friends.add(john);
friends.add(smith);

   friends被序列化为下面的xml片断:

<list>
  <type>java.util.ArrayList</type>
  <length>2</length>
  <map>
    <type>domain.People</type>
    <string>friend</string>
    <map>
      <type>domain.People</type>
      <string>friend</friend>
      <ref>1</ref>
    </map>
  </map>
</list>

   其中ref=1表示对对象#1的引用作为它的值。xml片断中的每个<list>、<map>将被看作对象并具有一个引用id。

fault

    <fault>表示当在调用服务方法时出现异常的信息。 <fault>的结构像map一样,但只有3个属性:code,message,detail。code是异常的类名;message为exception.getMessage()方法返回值;如果可行的话,detail将被赋值为exception.getCause().getMessage()方法返回值。我们设计此标记的目的是为了使web UI不再显示错误堆栈给用户。

几个例外的类型

    这里列出了一些例外的类型,它们有着与前面不同的序列化方法。

  1. java.sql.Date:由于java.sql.Date类重载了java.util.Date类的大多数方法,所以此类型的对象将被序列化为下面的xml片断:
    <map>
      <type>java.sql.Date</type>
      <string>value</string>
      <date>20061018T211400Z</date>
    </map>
  2. java.math.BigDecimal和java.math.BigInteger:这两个类有着复杂的内部字段,而这些字段对于web客户端来讲是没用的。所以这两种类型的对象将被序列化为下面的xml片断:
<map>
  <type>java.math.BigDecimal</type> <!-- or java.math.BigInteger-->
  <string>value</string>
  <string>1234567890</string>
</map>

    你可以通过xml中对象的value(比如上例中的value)来获得这些对象的真实值。在反序列化时,Buffalo将使用BigDecimal(String) 或 BigInteger(String)方法建立新的对象。(来源 www.iocblog.net)

    注意:我们不鼓励在web客户端序列化上面的数据类型。




文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。