Smack提供了一个简单地机制向packet附加任意属性。每个属性有一个字符串名称,和一个Java原始类型(int,long,flat,double,boolean)的值或者任何可序列化的对象(一个对象当他实现了Serializable接口的时候是可序列化的)。
使用API
所有主要对象有属性支持,例如Message对象。下面的代码演示了如何设置属性:
Message message = chat.createMessage();
// Add a Color object as a property.
message.setProperty("favoriteColor", new Color(0, 0, 255));
// Add an int as a property.
message.setProperty("favoriteNumber", 4);
chat.sendMessage(message);
获取这些属性应该使用下面的代码:
Message message = chat.nextMessage();
// Get a Color object property.
Color favoriteColor = (Color)message.getProperty("favoriteColor");
// Get an int property. Note that properties are always returned as
// Objects, so we must cast the value to an Integer, then convert
// it to an int.
int favoriteNumber = ((Integer)message.getProperty("favoriteNumber")).intValue();
对象做为属性
使用对象作为属性值是一个非常强大且简单地的数据交换方式。然而,你应该记住如下:
packet扩展名是向XMPP节添加额外的数据比较标准的方式。使用属性可能在某些情况下更方便,可是,Smack将执行处理XML的工作。
当你以一个Java对象作为属性的时候,仅仅运行java的客户端能翻译这个数据。所以,考虑使用一系列原始的值来传输数据替代。
作为属性值的对象必须实现Serialiable。此外,发送者和接收者必须有这个类的最新版本,不然当序列化这个对象的时候将会产生一个serialization异常。
序列化对象能十分大,它将使用更多的带宽和服务器资源。
XML格式
当前用于发送属性数据的XML格式不是一个标准,所以在没有使用smack的客户端将可能无法识别。这个XML如下面所示(清晰的添加注释):
<!-- All properties are in a x block. -->
<properties xmlns="http://www.jivesoftware.com/xmlns/xmpp/properties">
<!-- First, a property named "prop1" that's an integer. -->
<property>
<name>prop1</name>
<value type="integer">123</value>
<property>
<!-- Next, a Java object that's been serialized and then converted from binary data to base-64 encoded text. -->
<property>
<name>blah2</name>
<value type="java-object">adf612fna9nab</value>
<property>
</properties>
当前支持的类型是:integer,long,float,double,boolean,string,和java-object。
新技术,新未来!欢迎大家关注
“1024工场”微信服务号
,时刻关注我们的最新的技术讯息!
(甭客气!尽情的扫描或者长按!)