`

XStream序列化对象,java.util.Map自定义Converter

阅读更多

如果你不知道XStream是什么东东,请看我以前的一篇文章:

http://fuliang.iteye.com/blog/379429

 

今天用XStream序列化对象,其中有Map类型的字段,结果不让人满意

 <ExtractResult>
  <dataRecords>
    <DataRecord>
      <properties>
        <property>
          <string>region</string>
          <string>非洲中东</string>
        </property>
        <property>
          <string>routeReference</string>
          <string>首都机场集合,搭乘土耳其航空直飞伊斯坦布尔,夜宿机上。</string>
        </property>
        <property>
          <string>routeDays</string>
          <string>10</string>
        </property>
        <property>
          <string>price</string>
          <string>¥13500起</string>
        </property>
        <property>
          <string>subject</string>
          <string>常规</string>
        </property>
        <property>
          <string>dayOfBookingExpired</string>
          <string>2010-02-01</string>
        </property>
        <property>
          <string>departure</string>
          <string>北京</string>
        </property>
        <property>
          <string>dayOfDeparture</string>
          <string>2010-02-10</string>
        </property>
        <property>
          <string>title</string>
          <string>[团队游]埃及土耳其10日千年文明之旅(春节)</string>
        </property>
      </properties>
    </DataRecord>
  </dataRecords>
</ExtractResult>

其中的key和value被序列化成:

 

<string>region</string>
<string>非洲中东</string>

我比较想要的结果是

 

<property key="region" value="非洲中东"/>

查看了XStream的文档,可以通过自定义Converter来转换,经过尝试,只需要很简单的步骤就可以完成:

 

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter;
import com.thoughtworks.xstream.io.ExtendedHierarchicalStreamWriterHelper;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.mapper.Mapper;

/**
 * @author fuliang
 * 
 */
public class MapCustomConverter extends AbstractCollectionConverter {

    /**
	 * @param mapper
	 */
	public MapCustomConverter(Mapper mapper) {
		super(mapper);
	}

	public boolean canConvert(Class type) {
        return type.equals(HashMap.class)
                || type.equals(Hashtable.class)
                || type.getName().equals("java.util.LinkedHashMap")
                || type.getName().equals("sun.font.AttributeMap") // Used by java.awt.Font in JDK 6
                ;
    }

    public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
        Map map = (Map) source;
        for (Iterator iterator = map.entrySet().iterator(); iterator.hasNext();) {
            Entry entry = (Entry) iterator.next();
            ExtendedHierarchicalStreamWriterHelper.startNode(writer, "property", Entry.class);

            writer.addAttribute("key",  entry.getKey().toString());
            writer.addAttribute("value", entry.getValue().toString());
            writer.endNode();
        }
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        Map map = (Map) createCollection(context.getRequiredType());
        populateMap(reader, context, map);
        return map;
    }

    protected void populateMap(HierarchicalStreamReader reader, UnmarshallingContext context, Map map) {
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            Object key = reader.getAttribute("key");
            Object value = reader.getAttribute("value");
            map.put(key, value);
            reader.moveUp();
        }
    }
}

然后这么使用:

XStream xStream = new XStream();
xStream.registerConverter(new MapCustomConverter(new DefaultMapper(XmlOutputFormatter.class.getClassLoader())));
xStream.alias("DataRecord", ExtractDataRecord.class);
xStream.alias("ExtractResult", ExtractResult.class);
xStream.alias("property", Entry.class);
return xStream.toXML(extractResult);
 

序列化后的结果很漂亮:

 

<ExtractResult>
  <dataRecords>
    <DataRecord>
      <properties>
        <property key="region" value="港澳"/>
        <property key="routeReference" value="搭乘国际航班直飞桃园国际机场,办理相关手续后,前往用晚餐。前往酒店入住休息。"/>
        <property key="routeDays" value="8"/>
        <property key="price" value="¥5680起"/>
        <property key="subject" value="常规"/>
        <property key="dayOfBookingExpired" value="2010-01-15"/>
        <property key="departure" value="北京"/>
        <property key="dayOfDeparture" value="2010-01-25"/>
        <property key="title" value="[团队游]台湾8日宝岛乡情之旅"/>
      </properties>
    </DataRecord>
  </dataRecords>
</ExtractResult>
7
0
分享到:
评论
1 楼 widekk 2013-06-05  
引用
[i][/i]
       

相关推荐

    com.thoughtworks.xstream.XStream操作XML和java对象的一些用法

    首先,XStream是一个强大的库,它由Pete Gyford开发,用于将Java对象序列化为XML,同时也能将XML反序列化为Java对象。它的主要优点是代码简洁,易于理解,同时也支持自定义转换规则,使得XML的结构可以更贴近业务...

    使用XStream序列化/反序列化对象

    // 序列化对象到XML字符串 String xml = xstream.toXML(person); System.out.println(xml); // 反序列化XML字符串回Person对象 Person deserializedPerson = (Person) xstream.fromXML(xml); // 检查反...

    xstream-1.4.3-sources.jar

    XStream 用法详解 XML 转换为 java 实体类 所需要的 xstream-1.4.3-sources.jar jar包 具体实现请参考 http://blog.csdn.net/morning99/article/details/28875159

    xstream_1.4.11.1.jar

    xstream_1.4.11.1.jar 是list转化为xml必须的jar包,通过下载导入可以正常使用

    xstream-1.4.3.jar.zip

    这个库为开发者提供了强大的工具,能够轻松地将复杂的Java对象序列化为XML格式的数据,同时也能将XML数据反序列化回原来的Java对象。 在Java开发中,数据的序列化是常见的需求,特别是在持久化存储、网络传输和配置...

    java XStream xml解析 jar包.zip

    Java中的XStream库是一个强大的工具,它用于将Java对象序列化为XML,同时也能将XML数据反序列化回相应的Java对象。XStream以其简洁的API和直观的使用方式,在处理XML数据时受到开发者们的欢迎。在"java XStream xml...

    XStream对象序列化

    XStream对象序列化是一种在Java应用程序中将Java对象转换为XML格式的过程,这主要通过XStream库实现。这个库提供了一种简洁的方式来处理对象到XML的转换,反之亦然,而不需要复杂的配置或对对象进行特定的修改。...

    xstream-1.4.4-sources.jar

    XStream 是一个开源项目,一套简单实用的类库,用于序列化对象与 XML 对象之间的相互转换。将 XML 文件内容解析为一个对象或将一个对象序列化为 XML 文件。

    xstream-1.4.10-java7.jar

    xstream-1.4.10-java7.jar。 稳定版,由jdk1.7编译。

    xstream-1.1.3正反序列化JAVA对象

    4. 序列化对象:使用XStream的`toXML()`方法可以将Java对象转换为XML字符串。例如: ```java Person person = new Person("John", 30); XStream xstream = new XStream(); String xml = xstream.toXML(person); ``` ...

    XStream的Date转换 @XStreamConverter DateConverter

    我们使用XStream实例,注册自定义的Date转换器,然后将对象序列化成XML并打印出来。接着,我们反序列化XML回`MyClass`对象,确保日期的序列化和反序列化过程无误。 总之,通过使用`@XStreamConverter`注解自定义...

    xstream-1.3.1.jar.zip

    XStream是一个强大的Java库,它提供了一种简单而直观的方式来序列化和反序列化Java对象为XML,反之亦然。这个库广泛应用于那些需要在程序中处理XML数据,或将Java对象持久化的场景。在本文中,我们将深入探讨XStream...

    xstream-all-1.4.7.jar

    xstream-all-1.4.7.jar;xstream-all-1.4.7.jar;xstream-all-1.4.7.jar;

    activemq-transport-xstream-1.3.jar.zip

    XStream是一个强大的Java库,可以将任何Java对象转换为XML,反之亦然,使得数据可以在网络间传输或持久化存储。 "activemq-transport-xstream-1.3.jar"是这个组件的主要实现文件,包含了XStream Transport的所有类...

    activemq-transport-xstream-1.4.jar.zip

    XStream库则被用作数据序列化工具,它能够将Java对象转换为XML,反之亦然,这对于在网络间或者持久存储时传输和恢复对象非常有用。 "activemq-transport-xstream-1.4.jar"是这个特定组件的Java Archive(JAR)文件...

    XStream 1.4.11 jar包

    XStream 是一个强大的 Java 库,它提供了一种简单且高效的方式来序列化和反序列化 Java 对象为 XML,反之亦然。这个工具库的设计目标是使得 XML 和 Java 对象之间的转换变得极其简单,同时也保持了代码的可读性和...

    使用 XStream 把 Java 对象序列化为 XML

    XStream是一个强大的Java库,它允许开发者轻松地将Java对象序列化为XML,反之亦然。这个库特别有用,因为它提供了直观且易于使用的API,使得XML数据绑定变得简单。 **XStream 库简介** XStream由Johannes Link创建...

    Xstream操作Xml与Json.doc

    要将 Java 对象序列化为 XML,首先需要创建一个 Xstream 实例,然后使用 `toXML()` 方法。例如: ```java Xstream xstream = new Xstream(); String xml = xstream.toXML(yourObject); ``` #### (2) Xstream 序列...

    xStream 实现xml与 java对象的转换

    这时,xStream库应运而生,它提供了一个简单、高效的API来实现XML与Java对象之间的序列化和反序列化。 xStream库的核心概念是“映射”,它通过创建一个映射关系,将Java对象与XML元素和属性对应起来。这使得我们...

    activemq-transport-xstream-1.5.jar.zip

    "activemq-transport-xstream-1.5.jar"是ActiveMQ中的一个关键组件,它的主要作用是利用XStream库来处理消息的序列化与反序列化。XStream是一个Java库,能够将对象转换为XML,再将XML还原为等效的对象。这种转换能力...

Global site tag (gtag.js) - Google Analytics