xStream之xml

1. 把对象进行字符串输出,把字符串作为对象读入

package org.frame.xstream;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StringReader;
import java.io.StringWriter;
import java.io.Writer;

import org.frame.xstream.dataobject.blog.Entry;

import com.thoughtworks.xstream.XStream;

public class TestObjectOutputStream {

public static void main(String[] args) throws IOException, ClassNotFoundException {
XStream xstream = new XStream();
StringWriter someWriter = new StringWriter();
ObjectOutputStream out = xstream.createObjectOutputStream(someWriter);
out.writeObject(new Entry("Joe", "Walnes"));
out.writeObject(new Entry("Someone", "Else"));
out.writeObject("hello");
out.writeInt(12345);
out.close();
System.out.println(someWriter.toString());

StringReader someReader = new StringReader(someWriter.toString());
ObjectInputStream in = xstream.createObjectInputStream(someReader);

Entry a = (Entry)in.readObject();
Entry b = (Entry)in.readObject();
String h = (String)in.readObject();
int aa = in.readInt();
System.out.println(a.title);
System.out.println(a.description);
System.out.println(b.title);
System.out.println(b.description);
System.out.println(h);
System.out.println(aa);
}
}


2. 把对象序列化到文件,和把文件反序列化为对象

package org.frame.xstream;

import java.util.Iterator;
import java.util.List;

import org.frame.xstream.dataobject.blog.Author;
import java.io.File;

import com.thoughtworks.xstream.persistence.FilePersistenceStrategy;
import com.thoughtworks.xstream.persistence.PersistenceStrategy;
import com.thoughtworks.xstream.persistence.XmlArrayList;

public class TestPersistence {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//the E:/tmp must be exists
PersistenceStrategy strategy = new FilePersistenceStrategy(new File("E:/tmp"));
add(strategy);
remove(strategy);
}


public static void add(PersistenceStrategy strategy ){
// creates the list:
List list = new XmlArrayList(strategy);

// adds four authors
list.add(new Author("joe walnes"));
list.add(new Author("joerg schaible"));
list.add(new Author("mauro talevi"));
list.add(new Author("guilherme silveira"));

// adding an extra author
Author mistake = new Author("mama");
list.add(mistake);
//五个对象会生成五个文件 int@1.xml, int@2.xml, int@3.xml, int@4.xml, int@5.xml
//原来xstream生成全名的原因是为了序列化和反序列化.
}

public static void remove(PersistenceStrategy strategy){
// looks up the list:
List list = new XmlArrayList(strategy);

// remember the list is still there! the files int@[1-5].xml are still in /tmp!
// the list was persisted!

for(Iterator it = list.iterator(); it.hasNext(); ) {
Author author = (Author) it.next();
if(author.getName().equals("mama")) {
System.out.println("Removing mama...");
it.remove();
} else {
System.out.println("Keeping " + author.getName());
}
}
}

}


文件内容如下

<org.frame.xstream.dataobject.blog.Author>
<name>mauro talevi</name>
</org.frame.xstream.dataobject.blog.Author>

其实这种方式挺好,比如会员登陆可以生成其登陆的基本信息,需要获取的时候,从文件系统反序列化读取,与数据库类似,但是存储的内容比较少,适合一般的场景,不需要数据库时[当然如果使用这种方式来实现数据库的API也不错啊,有时间研究研究,写测试用例的时候就可以更清晰了]
3. 把json转化为对象,和把对象生成对应的json

package org.frame.xstream;

import java.io.Writer;

import org.frame.xstream.dataobject.blog.Entry;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;
import com.thoughtworks.xstream.io.json.JsonWriter;

/**
* 其实使用返回的 { susccess: "true", errorMessage: "你长得太丑了" }
*
* 可以使用对象形式,也可以建一个vm文件来维护返回的信息,推荐*.vm. 当然使用Action直接返回字符串,比拼凑的好玩点.
*
* @author yangchunlong.tw
*
*/
public class TestWithJson {

/**
* @param args
*/
public static void main(String[] args) {
XStream xstream = createByJettison();
jsonToObject(xstream);
}

public static void createJson(XStream xstream) {
Entry product = new Entry("Banana", "123");
xstream.setMode(XStream.NO_REFERENCES);
xstream.alias("product", Entry.class);
System.out.println(xstream.toXML(product));
// 把xstream使用到json上也是相当给力的.

// 这里都有一个对象名,还有一个不要根节点的
}

public static void jsonToObject(XStream xstream) {
String json = "{\"product\":{\"title\":\"Banana\",\"description\":123}}";

//XStream xstream = new XStream(new JettisonMappedXmlDriver());
xstream.alias("product", Entry.class);
Entry product = (Entry) xstream.fromXML(json);
System.out.println(product.title);
System.out.println(product.description);
}

public static XStream createByJettison() {
return new XStream(new JettisonMappedXmlDriver());
}

public static XStream createByJDK() {
// 不需要根节点,这个牛B了,不是接口也可以重写方法
return new XStream(new JsonHierarchicalStreamDriver() {
public HierarchicalStreamWriter createWriter(Writer writer) {
return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE);
}
});
}

}



4. 把对象转化为xml和把xml转化为对象

package org.frame.xstream;

import org.frame.xstream.dataobject.Person;
import org.frame.xstream.dataobject.PhoneNumber;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class TestXStream {

public static void main(String[] args) {
//声名xstream
XStream xstream = createByXPP3();
xstream.alias("person", Person.class);
xstream.alias("phonenumber", PhoneNumber.class);

//组织对象
Person joe = new Person("Joe", "Walnes");
joe.setPhone(new PhoneNumber(123, "1234-456"));

//生成xml
String xml = xstream.toXML(joe);
System.out.println(xml);

Person re = (Person) xstream.fromXML(xml);
System.out.println(re.getFirstname());
System.out.println(re.getLastname());
System.out.println(re.getPhone().getCode());
System.out.println(re.getPhone().getNumber());

}

/**
* XPP3.
*
* javax.xml.parsers.DocumentBuilderFactory
* @return
*/
public static XStream createByXPP3(){
return new XStream();
}

/**
* JAXP DOM parser
*
* javax.xml.parsers.DocumentBuilderFactory
* @return
*/
public static XStream createByDomDrive(){
return new XStream(new DomDriver());
}

/**
* Java 6 the integrated StAX parser
* <?xml version="1.0" ?>
*
* @return
*/
public static XStream createByStax(){
return new XStream(new StaxDriver());
}


}
5. 可以使用xstream高级有功能,使实体与xml名字不对应也能互转
[code="java"]
package org.frame.xstream;

import org.frame.xstream.dataobject.Person;
import org.frame.xstream.dataobject.PhoneNumber;
import org.frame.xstream.dataobject.blog.Author;
import org.frame.xstream.dataobject.blog.AuthorConverter;
import org.frame.xstream.dataobject.blog.Blog;
import org.frame.xstream.dataobject.blog.Entry;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
import com.thoughtworks.xstream.io.xml.StaxDriver;

public class TestXStreamAlias {

public static void main(String[] args) {

Blog teamBlog = new Blog(new Author("Guilherme Silveira"));
teamBlog.add(new Entry("first","My first blog entry."));
teamBlog.add(new Entry("tutorial",
"Today we have developed a nice alias tutorial. Tell your friends! NOW!"));

XStream xstream = createByXPP3();
// xstream.alias("blog", Blog.class);
// xstream.alias("entry", Entry.class);//指定类的别包
// xstream.aliasPackage("org.ycl", "org.frame");//改变包名
xstream.processAnnotations(Blog.class);//启动Blog类的注解


// xstream.useAttributeFor(Blog.class, "writer");//设置节点为属性
xstream.aliasField("author", Blog.class, "writer");//指定类中属性的别名
xstream.processAnnotations(Entry.class);//启动Entry类的注解
//如何把Anthor对象转化为String
//xstream.registerConverter(new AuthorConverter());
// xstream.addImplicitCollection(Blog.class, "entries");//不显示集合元素.
String xml = xstream.toXML(teamBlog);
System.out.println(xml);

Blog re = (Blog) xstream.fromXML(xml);
System.out.println(re.getContent());
System.out.println(re.writer.getName());
}

/**
* XPP3.
*
* javax.xml.parsers.DocumentBuilderFactory
* @return
*/
public static XStream createByXPP3(){
return new XStream();
}

/**
* JAXP DOM parser
*
* javax.xml.parsers.DocumentBuilderFactory
* @return
*/
public static XStream createByDomDrive(){
return new XStream(new DomDriver());
}

/**
* Java 6 the integrated StAX parser
* <?xml version="1.0" ?>
*
* @return
*/
public static XStream createByStax(){
return new XStream(new StaxDriver());
}


}


[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值