- 浏览: 648530 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
ssxszt:
...
解决PopUpManager弹出窗口RangeError: Error #2006: 提供的索引超出范围 -
lijiajia:
木子佳 写道楼主,想要源码学习,谢谢。kajiamuzi@16 ...
DataGrid和AdvancedDataGrid CheckBox全选功能 -
juedi:
很好,是我需要的东东
Flex异常处理设计 -
暖暖fh:
大神,我想要源码,这个功能我折腾了好我啊 fuhan247@1 ...
DataGrid和AdvancedDataGrid CheckBox全选功能 -
chenzi:
一样的代码,两台机器上面,完全不同的报错。。Flex实现htt ...
Flex使用Https协议
本篇主要讲解XStream的Converter
- 简单的Converter
先创建一个简单的pojo类
public class Person { @Override public String toString() { // TODO Auto-generated method stub return getName(); } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
创建一个Person的Converter
public class PersonConverter implements Converter { @Override public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext content) { Person person=(Person)value; writer.startNode("fullname"); writer.setValue(person.getName()); writer.endNode(); } @Override public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext content) { Person person=new Person(); reader.moveDown(); person.setName(reader.getValue()); reader.moveUp(); return person; } @Override public boolean canConvert(Class calzz) { return Person.class==calzz; } }
测试Person的Converter
public class PersonTest { /** * @param args */ public static void main(String[] args) { Person person=new Person(); person.setName("张三"); XStream stream=new XStream(); stream.alias("person", Person.class); //stream.registerConverter(new PersonConverter()); stream.registerConverter(new PersonSingleValueConverter()); String xml=stream.toXML(person); System.out.println("xml:"+xml); Person p=(Person) stream.fromXML(xml); String name=p.getName(); System.out.println("name:"+name); } }
如果一个只有一个String类型的属性,我们可以用AbstractSingleValueConverter
public class PersonSingleValueConverter extends AbstractSingleValueConverter { @Override public boolean canConvert(Class clazz) { return clazz.equals(Person.class); } @Override public Object fromString(String str) { Person person=new Person(); //System.out.println("str+...."+str); person.setName(str); return person; } }
以上注意方法注意的一点是得重写Person的toString方法
@Override public String toString() { // TODO Auto-generated method stub return getName(); }
2.Date的Converter
public class DateConverter implements Converter { private Locale locale; public DateConverter(Locale locale) { super(); this.locale = locale; } public boolean canConvert(Class clazz) { return Calendar.class.isAssignableFrom(clazz); } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Calendar calendar = (Calendar) value; Date date = calendar.getTime(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, this.locale); writer.setValue(formatter.format(date)); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { GregorianCalendar calendar = new GregorianCalendar(); DateFormat formatter = DateFormat.getDateInstance(DateFormat.FULL, this.locale); try { calendar.setTime(formatter.parse(reader.getValue())); } catch (ParseException e) { throw new ConversionException(e.getMessage(), e); } return calendar; } }
注意:
1.DateFormat 的实现有些事非线程安全的,因此不能把它作为Converter的成员变量
2.Calendar.class.isAssignableFrom(clazz);
isAssignableFrom: 判定此 Class
对象所表示的类或接口与指定的 Class
参数所表示的类或接口是否相同,或是否是其超类或超接口。
public class DateTest { /** * @param args */ public static void main(String[] args) { // grabs the current date from the virtual machine Calendar calendar = new GregorianCalendar(); // creates the xstream XStream xStream = new XStream(new DomDriver()); // brazilian portuguese locale xStream.registerConverter(new DateConverter(Locale.CHINA)); // prints the result String xml=xStream.toXML(calendar); System.out.println("xml:"+xml); // loads the calendar from the string Calendar loaded = (Calendar) xStream.fromXML(xml); // prints using the system defined locale System.out.println(DateFormat.getDateInstance(DateFormat.FULL).format( loaded.getTime())); } }
3.Complex Converter复杂的转换器
public class Birthday { private Person person; private Calendar date; private char gender; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public Calendar getDate() { return date; } public void setDate(Calendar date) { this.date = date; } public char getGender() { return gender; } public void setGenderMale() { this.gender = 'm'; } public void setGenderFemale() { this.gender = 'f'; } }
Birthday的Converter
public class BirthdayConverter implements Converter { public boolean canConvert(Class clazz) { return Birthday.class == clazz; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Birthday birthday = (Birthday) value; if (birthday.getGender() != '\0') { writer.addAttribute("gender", Character.toString(birthday .getGender())); } if (birthday.getPerson() != null) { writer.startNode("person"); context.convertAnother(birthday.getPerson()); writer.endNode(); } if (birthday.getDate() != null) { writer.startNode("birth"); context.convertAnother(birthday.getDate()); writer.endNode(); } } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Birthday birthday = new Birthday(); String gender = reader.getAttribute("gender"); if (gender != null) { if (gender.length() > 0) { if (gender.charAt(0) == 'f') { birthday.setGenderFemale(); } else if (gender.charAt(0)== 'm') { birthday.setGenderMale(); } else { throw new ConversionException("Invalid gender value: " + gender); } } else { throw new ConversionException("Empty string is invalid gender value"); } } while (reader.hasMoreChildren()) { reader.moveDown(); if ("person".equals(reader.getNodeName())) { Person person = (Person)context.convertAnother(birthday, Person.class); birthday.setPerson(person); } else if ("birth".equals(reader.getNodeName())) { Calendar date = (Calendar)context.convertAnother(birthday, Calendar.class); birthday.setDate(date); } reader.moveUp(); } return birthday; } }
看到了没,在有些属性为null时,抛出了自定义的异常,如果能保证所有的属性都是非空的,可以用下面的方式实现Converter
public class BirthdayConverter2 implements Converter { public boolean canConvert(Class clazz) { return Birthday.class == clazz; } public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) { Birthday birthday = (Birthday)value; writer.addAttribute("gender", Character.toString(birthday.getGender())); writer.startNode("person"); context.convertAnother(birthday.getPerson()); writer.endNode(); writer.startNode("birth"); context.convertAnother(birthday.getDate()); writer.endNode(); } public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Birthday birthday = new Birthday(); if (reader.getAttribute("gender").charAt(0) == 'm') { birthday.setGenderMale(); } else { birthday.setGenderFemale(); } reader.moveDown(); Person person = (Person)context.convertAnother(birthday, Person.class); birthday.setPerson(person); reader.moveUp(); reader.moveDown(); Calendar date = (Calendar)context.convertAnother(birthday, Calendar.class); birthday.setDate(date); reader.moveUp(); return birthday; } }
Birthday的测试类
public class BirthdayTest { /** * @param args */ public static void main(String[] args) { Person person=new Person(); person.setName("张三"); Calendar date=Calendar.getInstance(); Birthday bir=new Birthday(); bir.setDate(date); bir.setPerson(person); bir.setGenderMale(); XStream stream=new XStream(); stream.alias("birthday", Birthday.class); stream.alias("person", Person.class); stream.registerConverter(new BirthdayConverter2()); stream.registerConverter(new DateConverter(Locale.CHINA)); String xml=stream.toXML(bir); System.out.println("xml:"+xml); Birthday b=(Birthday) stream.fromXML(xml); System.out.println("person.name"+b.getPerson().getName()); System.out.println(".date:"+DateFormat.getDateInstance(DateFormat.FULL).format( b.getDate().getTime())); System.out.println(".gender:"+b.getGender()); } }
发表评论
-
转 接口滥用问题
2011-08-22 16:57 1466我们知道,大家提倡面向接口编程,但凡事都有个度,当滥用,那么面 ... -
Jakarta Commons Cookbook学习笔记(一)
2010-08-14 22:20 2061开发中需要写很多工具类,大多数是关于字符串、文件 ... -
Effective java 读书笔记第八章(1)
2010-05-13 19:30 1404将局部变量的作用域最小化 较早的程序设计语言(如 ... -
Junit4学习笔记一
2010-03-18 12:31 1569Junit4是Junit框架 ... -
打印JdbcTemplate执行sql
2010-03-09 22:55 11626有关log4j的基础知识请参考log4j详解与实战,本文主要讲 ... -
POI学习笔记(四)
2010-01-03 12:07 1651大时代 -
POI学习笔记(三)
2010-01-02 22:10 386714. 自定义颜色 HSSF: HSSF ... -
POI学习笔记(二)
2010-01-02 20:42 28957. 设置单元格的边框 public void cr ... -
POI学习笔记(一)
2009-12-29 12:53 7114项目中经常要解析和生成Excel文件,最常用的开源 ... -
XStream学习笔记四
2009-12-05 11:30 2614XStream生成xml文件和从xml文件中得到对象 pub ... -
XStream学习笔记二
2009-12-03 13:47 1721以下面的xml文件展开讨论。 <blog author ... -
XStream学习笔记一
2009-12-03 10:12 2489XStream是一个实现java对象和xml相互转化的开源组件 ... -
取得系统的环境变量
2009-11-30 15:59 1189System.getProperty("java.l ... -
BigDecimal 加法保留小数位数
2009-11-07 09:39 7472BigDecimal bg1=new BigDecimal( ...
相关推荐
《xStream完美转换XML、JSON》学习笔记 在IT领域,数据交换是常见的需求,而XML和JSON作为两种广泛使用的数据格式,它们之间的转换尤为重要。xStream是一个强大的Java库,它能够轻松地将Java对象序列化为XML或反...
在本学习文档中,我们将深入探讨 XStream 的核心概念、用法以及如何在实际项目中应用。 一、XStream 简介 XStream 能够将复杂的 Java 对象结构转换成易于读写的 XML 格式,同时也能将 XML 文档还原为对应的 Java ...
最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar 最齐全的xstream1.4.8.jar ...
`xstream142和xpp3.zip`这个压缩包包含了`xstream-1.4.2.jar`和`xpp3_min-1.1.4c.jar`这两个重要的Java库,它们是处理XML时不可或缺的工具。 XStream是一款强大的Java库,由Joe Walnes创建,用于将Java对象序列化为...
XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...
3. **安全性**:XStream提供了安全模式,防止恶意的XML输入导致的安全漏洞,如XML注入攻击。 4. **自定义转换**:对于复杂的对象结构,XStream允许用户自定义转换器,以满足特殊需求。 5. **支持泛型**:XStream...
xstream最新版jar包
XPP3是XPP的第三版,而xpp3_min是精简版,去除了非必要的功能,以减小库的体积,提高性能。 在XStream中,XPP3作为默认的DOM(Document Object Model)替代品,用于构建内部的XML表示。XPP3的高效解析能力使得...
**XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的...通过深入学习和实践,我们可以充分利用 XStream 的优点,提高代码的可读性和可维护性。
XStream可以使用XPP3来解析XML流,这是在处理大量XML数据时的一个高效选择。 在使用这些jar包进行开发时,主要涉及以下几个知识点: - **对象序列化与反序列化**:XStream允许将Java对象直接转换为XML字符串,反之...
3. 使用安全的序列化库,如 Jackson 或 Google's Protobuf,它们提供了更好的安全防护机制。 4. 对所有传入的序列化数据进行深度验证和过滤,避免恶意输入。 在日常开发和维护中,保持库和框架的更新是减轻此类风险...
xstream xstream-1.4.5.jar
三、XStream的应用场景 1. **持久化存储**:将Java对象保存到XML文件,方便数据备份和迁移。 2. **网络传输**:在客户端和服务器之间,通过XML格式交换数据,简化网络通信。 3. **配置文件**:在配置文件中使用...
xstream-1.4.19.jar
3. 安全性增强:XStream 1.3.1版本对安全性进行了改进,可以防止恶意代码注入攻击,这在处理不受信任的XML输入时尤为重要。 4. 反序列化验证:XStream允许在反序列化过程中进行验证,确保XML数据符合预期的Java对象...
"xstream.jar及其他依赖jar包"是解决这一问题的重要工具,它包括了xstream-1.4.10.jar、xpp3-1.1.4c.jar和xmlpull_1_0_5.jar这三个文件。这些jar包提供了全面的Java对象到XML以及XML到Java对象的转换功能,简化了...
3. **Map集合转换XML文档** 对于Map集合,XStream会使用键作为XML标签,值作为内容: ```java Map, String> map = new HashMap(); map.put("key1", "value1"); map.put("key2", "value2"); String xmlMap = ...
这篇博客文章,标题为“xStream学习xml,JASON,JAVA对象转换”,显然会探讨如何利用XStream来处理这两种数据格式。 XStream的核心功能在于其简单易用的API,可以将Java对象直接序列化成XML或JSON字符串,同时也能...
当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...
3. **自定义转换器**:对于复杂的对象结构或者特殊类型的转换,可以通过实现`Converter`接口来自定义转换逻辑。 4. **域级注解**:XStream提供了`@XStreamAlias`、`@XStreamAsAttribute`等注解,允许开发者在类或...