XStream使用笔记

 

官网:http://xstream.codehaus.org/

官网上有很详细且简单易学的教程和实例。

 

作者:Headsen

日期:2013-11-2

 

简单高效的XML和JavaBean转换工具。最核心的两个方法。

   XStream xStream = new XStream();
   String xmlStr = xStream.toXml(obj);
   Object obj = xStream.fromXml(obj);

 

1、对于一个类的空对象(所有属性不赋值),返回一个根节点的报文。属性为Null的属性不会生成节点。属性非null的空值(如空字符串、空数组)会生成空白节点。

 

2、如果不设置类的别名,报文的根节点为【包名+类名】,显的臃肿,如:“xxx.package.ClassName”。

 

3、所有的注解,都有对应的java方法。注解的好处就是简单,但是耦合。两种方式各有各的好处。使用注解时,要调用下面方法激活。

xStream.processAnnotations(Person.class);

 

4、如果要处理的对象,多个属性引用统一对象,那么生成的XML很多节点数据会相同。XStream默认使用reference来精简XML的大小。如:

	List order = new ArrayList();
	order.add(bj);
	order.add(bj);
	order.add(order);
	结果:
	<list>
	  <CD>
	    <id>Next Road Cross</id>
	  </CD>
	  <CD reference="../CD"/>
	  <list reference=".."/>
	</list>

       可以通过setModel设置引用模式。但是,在上述例子中,由于Order引用自己,不过不设置引用解析,则会抛出循环依赖错误。

 

5、对于没有父(根)节点的XML报文,可以使用隐式集合。如:

xStream.addImplicitCollection(Person.class, "friends");

 

6、默认情况下,XStream会生成干净的XML。有时候为了生成配置文件,或可读性更好的XML,需要使用节点属性。

xStream.useAttributeFor(Person.class, "firstname");
<person firstname="Headsen"></person>

 

7、一些结构对象,想作为节点转换时,需要实现对应的Convertor。如:

/*
 * 联系方式类的转换器
 */
public class PhoneNumberConvertor implements SingleValueConverter {
    public boolean canConvert(Class type) {
        return type.equals(PhoneNumber.class);
    }
    public Object fromString(String number) {
        return new PhoneNumber(0, number);
    }
    public String toString(Object phone) {
        return ((PhoneNumber) phone).getCode() + "-" + ((PhoneNumber) phone).getNumber();
    }
}
xstream.registerConverter(new PhoneNumberConvertor());

结果:
<person lastname="Zhang" fax="111-412-4444">
</person>

 

8、有时候,不想某些属性生成在XML中,可使用以下方法:

xStream.omitField(Person.class, "firstname");

 

9、XStream还支持转换为JSON格式,只需注入合适的解析驱动即可。但是XStream并不建议这样做。JSON格式有很大的局限性,特别是表示一些稍微复杂的数据类型。

XStream xstream = new XStream(new JettisonMappedXmlDriver());

XStream很简单,简单的记一下。代码都没贴上来。这里有个不错的。

http://www.cnblogs.com/hoojo/archive/2011/04/22/2025197.html

 

在 Vue.js 项目中使用 [XStream](https://github.com/staltz/xstream)(一个用于响应式编程的库)可以增强数据流处理能力,特别是在需要处理异步事件流、组合多个事件源或进行复杂的状态管理时。XStream 提供了类似 RxJS 的功能,但更加轻量,适合与 Vue 的响应式系统结合使用。 ### 在 Vue 项目中引入 XStream 首先,通过 npm 或 yarn 安装 XStream: ```bash npm install xstream ``` 或者 ```bash yarn add xstream ``` ### 基本使用示例 以下是一个简单的示例,展示如何在 Vue 组件中使用 XStream 创建一个计数器应用: ```vue <template> <div> <p>当前计数:{{ count }}</p> <button @click="increment">增加</button> </div> </template> <script> import { Stream } from 'xstream'; export default { data() { return { count: 0 }; }, created() { // 创建点击事件流 const increment$ = Stream.create({ start: listener => { this.increment = () => listener.next(); }, stop: () => {} }); // 初始值为 0,每次点击增加 1 increment$ .fold(acc => acc + 1, 0) .onValue(count => { this.count = count; }); } }; </script> ``` ### 结合 Vuex 使用 XStream 如果项目中使用了 Vuex,可以将 XStream 与 Vuex 结合,用于处理更复杂的状态逻辑。例如,可以在 Vuex 的 `actions` 或 `modules` 中使用 XStream 来处理异步操作或组合多个数据源: ```javascript import { Stream } from 'xstream'; import { map } from 'xstream/operators'; export const actions = { fetchData({ commit }) { // 创建一个 HTTP 请求流 const data$ = Stream.fromPromise(fetch('https://api.example.com/data').then(res => res.json())); data$ .map(data => data.items) .onValue(items => { commit('SET_ITEMS', items); }); } }; ``` ### XStream 与 Vue 3 的响应式系统 在 Vue 3 中,响应式系统已经重构为基于 `Proxy` 和 `reactive`/`ref` 的方式,与 XStream 的结合可以更自然。例如,可以将 XStream 流与 `ref` 结合,实现响应式数据更新: ```vue <script setup> import { ref } from 'vue'; import { Stream } from 'xstream'; const count = ref(0); const increment$ = Stream.create({ start: listener => { // 模拟外部事件源 setInterval(() => listener.next(), 1000); }, stop: () => {} }); increment$ .fold(acc => acc + 1, 0) .onValue(val => { count.value = val; }); </script> ``` ### 优势与适用场景 - **异步处理**:XStream 提供了强大的异步事件流处理能力,适合用于处理用户输入、网络请求等。 - **组合能力**:支持操作符如 `map`、`filter`、`merge` 等,方便组合多个流。 - **轻量高效**:相比 RxJS,XStream 更加轻量,适合对性能敏感的项目。 ### 注意事项 - **学习曲线**:XStream 基于函数式响应式编程(FRP),需要一定的学习成本。 - **调试复杂性**:流式编程可能使调试变得复杂,尤其是在处理多个流组合时。 - **生态支持**:虽然 XStream 功能强大,但其社区和生态相比 RxJS 略小。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值