`
yunzhongxia
  • 浏览: 647445 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

XStream学习笔记三

    博客分类:
  • java
阅读更多

本篇主要讲解XStream的Converter

  1. 简单的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());
		

	}

}

 

分享到:
评论

相关推荐

    xstream学习文档及实例

    在本学习文档中,我们将深入探讨 XStream 的核心概念、用法以及如何在实际项目中应用。 一、XStream 简介 XStream 能够将复杂的 Java 对象结构转换成易于读写的 XML 格式,同时也能将 XML 文档还原为对应的 Java ...

    《xStream完美转换XML、JSON》学习笔记

    《xStream完美转换XML、JSON》学习笔记 在IT领域,数据交换是常见的需求,而XML和JSON作为两种广泛使用的数据格式,它们之间的转换尤为重要。xStream是一个强大的Java库,它能够轻松地将Java对象序列化为XML或反...

    最齐全的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 最齐全的xstream1.4.8.jar ...

    xstream142和xpp3.zip

    `xstream142和xpp3.zip`这个压缩包包含了`xstream-1.4.2.jar`和`xpp3_min-1.1.4c.jar`这两个重要的Java库,它们是处理XML时不可或缺的工具。 XStream是一款强大的Java库,由Joe Walnes创建,用于将Java对象序列化为...

    xstream-1.4.2.jar

    3. **安全性**:XStream提供了安全模式,防止恶意的XML输入导致的安全漏洞,如XML注入攻击。 4. **自定义转换**:对于复杂的对象结构,XStream允许用户自定义转换器,以满足特殊需求。 5. **支持泛型**:XStream...

    xstream-1.4.15.jar

    XStream 反序列化漏洞(CVE-2020-26258 & 26259),修复jar包 xstream-1.4.15.jar Xstream 是 Java 类库,用来将对象序列化成 XML (JSON) 或反序列化为对象。XStream 是一款开源软件,允许在 BSD 许可证的许可下分发...

    xstream最新版 - xstream-1.4.18.jar

    xstream最新版jar包

    xstream解析依赖包

    XPP3是XPP的第三版,而xpp3_min是精简版,去除了非必要的功能,以减小库的体积,提高性能。 在XStream中,XPP3作为默认的DOM(Document Object Model)替代品,用于构建内部的XML表示。XPP3的高效解析能力使得...

    xStream完整Jar包

    **XStream 概述** XStream 是一个 Java 库,用于将对象序列化为 XML,以及从 XML 反序列化回对象。它提供了一种简单而直观的...通过深入学习和实践,我们可以充分利用 XStream 的优点,提高代码的可读性和可维护性。

    xstream相关的jar包

    XStream可以使用XPP3来解析XML流,这是在处理大量XML数据时的一个高效选择。 在使用这些jar包进行开发时,主要涉及以下几个知识点: - **对象序列化与反序列化**:XStream允许将Java对象直接转换为XML字符串,反之...

    xstream1.4.15.JAR

    3. 使用安全的序列化库,如 Jackson 或 Google's Protobuf,它们提供了更好的安全防护机制。 4. 对所有传入的序列化数据进行深度验证和过滤,避免恶意输入。 在日常开发和维护中,保持库和框架的更新是减轻此类风险...

    xstream-1.4.5.jar

    xstream xstream-1.4.5.jar

    xstream-1.4.2

    三、XStream的应用场景 1. **持久化存储**:将Java对象保存到XML文件,方便数据备份和迁移。 2. **网络传输**:在客户端和服务器之间,通过XML格式交换数据,简化网络通信。 3. **配置文件**:在配置文件中使用...

    xstream-1.3.1.zip

    3. 安全性增强:XStream 1.3.1版本对安全性进行了改进,可以防止恶意代码注入攻击,这在处理不受信任的XML输入时尤为重要。 4. 反序列化验证:XStream允许在反序列化过程中进行验证,确保XML数据符合预期的Java对象...

    xstream.jar及其他依赖jar包

    "xstream.jar及其他依赖jar包"是解决这一问题的重要工具,它包括了xstream-1.4.10.jar、xpp3-1.1.4c.jar和xmlpull_1_0_5.jar这三个文件。这些jar包提供了全面的Java对象到XML以及XML到Java对象的转换功能,简化了...

    com.thoughtworks.xstream.XStream操作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学习xml,JASON,JAVA对象转换”,显然会探讨如何利用XStream来处理这两种数据格式。 XStream的核心功能在于其简单易用的API,可以将Java对象直接序列化成XML或JSON字符串,同时也能...

    xstream-1.4.19.jar

    xstream-1.4.19.jar

    Java用xStream拼接xml

    当需要将数据转换为XML格式以便于传输或处理时,工具如xStream就显得尤为重要。Java中的xStream库提供了一个简单易用的方式来将Java对象序列化为XML,反之亦然,即反序列化XML回Java对象。 **xStream简介** xStream...

    xstream-1.4.8最齐全的jar包

    3. **自定义转换器**:对于复杂的对象结构或者特殊类型的转换,可以通过实现`Converter`接口来自定义转换逻辑。 4. **域级注解**:XStream提供了`@XStreamAlias`、`@XStreamAsAttribute`等注解,允许开发者在类或...

Global site tag (gtag.js) - Google Analytics