Buffalo协议
协议概述
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不再显示错误堆栈给用户。
几个例外的类型
这里列出了一些例外的类型,它们有着与前面不同的序列化方法。
- java.sql.Date:由于java.sql.Date类重载了java.util.Date类的大多数方法,所以此类型的对象将被序列化为下面的xml片断:
<map> <type>java.sql.Date</type> <string>value</string> <date>20061018T211400Z</date> </map>
- 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
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。