
Smack3.4.1文档翻译:数据包属性,Packet Properties
Smack提供 了一种简易的机制,可将任意的属性附加到数据包中。每个属性 都拥有一个字符串( String )类型的名字, 以及一个值,值可以是一个 Java基本数据类型(int 、 long 、 float 、 double 、 boolean)或者任意 的可序列化的(Serializable)对象 ( 一个 Java对象 ,如果它实现了Serializable 接口的话,则是可序列化的 ) 。
使用 其应用编程接口
所有的主要对象都支持属性,例如Message对象。以下代码演示了如何设置属性:
Message message = chat.createMessage();
// 添加一个Color对象作为一个属性。
message.setProperty("favoriteColor", new Color(0, 0, 255));
// 添加一个int作为一个属性。
message.setProperty("favoriteNumber", 4);
chat.sendMessage(message);
使用以下代码可以获取到那些属性:
Message message = chat.nextMessage();
// 获取一个Color对象属性。
Color favoriteColor = (Color)message.getProperty("favoriteColor");
// 获取一个属性。注意,属性永远是作为对象(Objects)来返回的,
// 所以我们必须将它的值转换成一个Integer,然后转换为一个int。
int favoriteNumber = ((Integer)message.getProperty("favoriteNumber")).intValue();
使用对象(Objects)作为属性
使用对象作为属性值,这是一种强大而又简单的交换数据的方式。然而,妳需要注意以下事项:
•.数据包扩展是向XMPP 通信中加入额外数据的最标准方式。然而,在某些情况下,使用属性可能是更方便的方式,因为Smack会做好XML 的处理工作。
•. 当妳将一个Java对象作为属性发送时,只有那些以Java实现的客户端能够解析该数据。所以,妳可以考虑一下替代方法:使用一个由基本类型值组成的序列来传送数据。
•.作为属性值发送的对象(Objects)必须实现Serialiable接口。另外,发送者和接收者必须拥有该类的同一个版本,否则,在对该对象进行反序列化时,会产生一个序列化异常。
•.序列化之后的对象可能会变得非常大,这会导致占用更多的带宽和服务器资源。
XML格式
当前用于发送属性数据的XML格式并不是标准中的一部分,所以,那些不是使用Smack 开发的客户端可能无法识别它们。XML会是以下这种样子(我们加入了注释以助于理解):
<!-- 所 有的属性都位于一个 x 块中。 -->
<properties xmlns="http://www.jivesoftware.com/xmlns/xmpp/properties">
<!-- 首先, 是一个名为的 "prop1"属性, 它是一个整数。 -->
<property>
<name>prop1</name>
<value type="integer">123</value>
<property>
<!-- 然后 ,是 一个 Java对象 ,它被序列化,然后 其二进制数据被转换为 base-64编码 的文字内容。 -->
<property>
<name>blah2</name>
<value type="java-object">adf612fna9nab</value>
<property>
</properties>
当前支持 的类型包括: integer 、 long 、 float 、 double 、 boolean 、 string 和 java-object 。
未知美人
HxLauncher: Launch Android applications by voice commands