StupidBeauty
Read times:919Posted at:Tue Mar 18 04:09:44 2014
- no title specified

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

未知美人

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands