`
rainshow
  • 浏览: 31441 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
文章分类
社区版块
存档分类
最新评论

XSTREAM序列化与反序列化

阅读更多
使用了XSTREAM的序列化和反序列化,感觉效果不错。

XSTREAM支持好几种方式的序列化(XML、JSON、BIN),几种方式都有其鲜明的优点:
1)XML方式最容易阅读,且应用范围比较广。
2)JSON方式便于WEB上的传输
3)BIN方式的性能最好,占用的空间也比较少

在反序列化时,由于类的结构发生变化导致一些属性不存在了,可以通过下面的方式对于不存在的属性予以忽略:

    private static final XStream DESERIALIZE_XSTREAM = new XStream() {

        /**
         * 忽略不存在的属性
         */
        protected MapperWrapper wrapMapper(MapperWrapper next) {
            return new MapperWrapper(next) {
                public Class<?> realClass(String elementName) {
                    try {
                        return super.realClass(elementName);
                    } catch (CannotResolveClassException crce) {
                        return null;
                    }
                }
            };
        }
    };


XSTREAM序列化时会带上类的全路径,比较不好看也占用空间,可以通过别名的方式简化
    static {
        final DatasetSerializer dsSerializer = new DatasetSerializer();
        final DateSerializer dtSerializer = new DateSerializer();
        SERIALIZE_XSTREAM.alias("MP", Map.class);
        SERIALIZE_XSTREAM.alias("DS", Dataset.class);
        SERIALIZE_XSTREAM.alias("ST", String.class);
        SERIALIZE_XSTREAM.registerConverter(dsSerializer);
        SERIALIZE_XSTREAM.registerConverter(dtSerializer);
        SERIALIZE_XSTREAM.setMode(XStream.NO_REFERENCES);

        DESERIALIZE_XSTREAM.alias("MP", Map.class);
        DESERIALIZE_XSTREAM.alias("DS", Dataset.class);
        DESERIALIZE_XSTREAM.alias("ST", String.class);
        DESERIALIZE_XSTREAM.registerConverter(dsSerializer);
        DESERIALIZE_XSTREAM.registerConverter(dtSerializer);
        DESERIALIZE_XSTREAM.setMode(XStream.NO_REFERENCES);
    }


使用BIN的方式序列化和反序列化对象:
    public static final byte[] serialize(XStream xstream, Object obj, boolean compress) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream(4096);
        xstream.marshal(obj, new BinaryStreamWriter(bos));
        //xstream.marshal(obj, new CompactWriter(new OutputStreamWriter(bos)));
        if (compress) {
            return compress(bos.toByteArray());
        } else {
            return bos.toByteArray();
        }
    }

    /**
     * 从XML byte数组中反序列化出一个对象
     * 
     * @param bytes
     * @return
     */
    public static final Object deserialize(byte[] bytes, boolean decompress) {
        byte[] newBytes;
        if (decompress) {
            newBytes = decompress(bytes);
        } else {
            newBytes = bytes;
        }
        ByteArrayInputStream bis = new ByteArrayInputStream(newBytes);
        BinaryStreamReader bsr = new BinaryStreamReader(bis);
        return DESERIALIZE_XSTREAM.unmarshal(bsr);
    }


XSTREAM序列化通过反射来获取对象属性值,一方面反射效率相对较慢,另一方面不是所有的属性都需要序列化。可以通过自己实现特定类的序列化来提高效率。
public class DatasetSerializer implements Converter {

    @SuppressWarnings("unchecked")
    public void marshal(Object obj, HierarchicalStreamWriter writer, MarshallingContext context) {
        Dataset ds = (Dataset) obj;
        List<Record> records = ds.getRecordList();
        if (!CollectionUtil.isEmpty(records)) {
            for (Record record : records) {
                writer.startNode("RC");
                Map<String, Object> map = record.getNewDatasMap();
                context.convertAnother(map);
                writer.endNode();
            }
        }
    }

    @SuppressWarnings("unchecked")
    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
        Dataset ds = new Dataset();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            Record r = ds.newRecord();
            if (reader.hasMoreChildren()) {
                Map<String, Object> m = (Map<String, Object>) context.convertAnother(reader, Map.class);
                r.setNewDatasMap(m);
            }
            reader.moveUp();
        }
        return ds;
    }

    @SuppressWarnings("unchecked")
    public boolean canConvert(Class cls) {
        return cls.equals(Dataset.class);
    }

}

public class DateSerializer implements Converter {

    public void marshal(Object dt, HierarchicalStreamWriter writer, MarshallingContext ctx) {
        Date date = (Date) dt;
        writer.setValue(String.valueOf(date.getTime()));
    }

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext ctx) {
        Long time = Long.valueOf(reader.getValue());
        return new Date(time);
    }

    @SuppressWarnings("unchecked")
    public boolean canConvert(Class cls) {
        return cls.equals(Date.class);
    }

}
分享到:
评论

相关推荐

    xstream序列化与反序列化

    xstream中xml与javaBean的互转

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

    // 检查反序列化的对象是否与原始对象一致 System.out.println(deserializedPerson.getName() + ", " + deserializedPerson.getSurname() + ", " + deserializedPerson.getAge()); } } ``` 在上述代码中,`...

    Bboss和xstream序列化反序列化性能对比1

    虽然Xstream在小规模数据的反序列化上表现更快,但与Bboss相比,其优势并不明显。 对于大负荷数据,由于没有提供具体的结果,我们无法直接比较两个库的性能。然而,可以推测随着数据规模的增加,两个库的性能差距...

    XStream对象序列化

    以下是如何使用XStream进行序列化和反序列化的简单步骤: 1. **序列化对象**: 为了序列化对象,你需要创建一个`XStream`实例,然后使用`toXML`方法将对象转换为XML字符串。例如,在`Writer`类中,可以创建一个`...

    xstream-1.1.3正反序列化JAVA对象

    标题提到的"xstream-1.1.3正反序列化JAVA对象"是指使用XStream 1.1.3版本来处理Java对象的序列化和反序列化操作。XStream的核心功能在于它可以将复杂的Java对象结构轻松地映射到XML结构上,这使得数据交换和持久化变...

    xstream反序列化流程分析1

    在本文中,我们将深入探讨XStream库的反序列化流程,这是一个流行的Java库,用于将XML数据转换为Java对象和反之亦然。XStream的反序列化过程涉及到多个步骤,从接收XML字符串到最终创建Java对象。以下是详细的分析:...

    基于 Java 的亿赛通电子文档安全管理系统XStream反序列化漏洞任意文件上传利用

    亿赛通电子文档安全管理系统存在XStream反序列化远程代码执行漏洞,攻击者可利用该漏洞对服务器上传任意文件,进而控制服务器权限。 使用 帮助信息 $ java -jar CDGXStreamDeserRCE.jar 亿赛通电子文档安全管理...

    亿赛通电子文档安全管理系统XStream反序列化漏洞任意文件上传利用_CDGXStreamDeserRCE.zip

    亿赛通电子文档安全管理系统XStream反序列化漏洞任意文件上传利用_CDGXStreamDeserRCE

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...

    XStream 1.3 API 手册

    XStream 是一个用 Java 编写的库,它提供了一种简单且高效的方式来序列化和反序列化对象到XML,反之亦然。这个API手册是针对XStream 1.3版本的,包含了详细的使用指南和技术信息,旨在帮助开发者更深入地理解和应用...

    Java实现序列化与反序列化的简单示例

    - **XML序列化与反序列化**:使用第三方库如XStream,可以将对象序列化为XML格式,也可以从XML反序列化回对象。这在需要以更结构化的方式存储或传输对象时非常有用。 ```java XStream xstream = new XStream(new ...

    Java实验7 序列化.doc

    但是,XStream库能够自动处理这种情况,将关联的`Address`对象也序列化到XML中。 在这个实验中,学习了如何利用第三方库实现Java对象到XML的序列化。XStream库的使用简化了这个过程,使得我们可以方便地在Java对象...

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

    在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象示例,而`src`目录可能包含了相关的Java源代码,供学习和参考。通过研究这些文件,你可以更深入地理解XStream的工作原理和使用方式。

    Xstream.Core 源代码 C#

    1. 数据存储与恢复:在持久化数据场景中,Xstream.Core可以将对象序列化为XML文件,然后在需要时反序列化回对象,便于数据的保存和读取。 2. 网络通信:在网络通信中,XML格式的数据交换是一种常见方式。Xstream....

    android XML简单序列化

    在Android中,我们可以使用`javax.xml.bind`包中的`Marshaller`和`Unmarshaller`接口来进行XML的序列化和反序列化。不过,由于Android原生API中并未包含这部分内容,我们需要引入额外的库,如Jackson、Gson或XStream...

    Xstream 相关jar包

    1. **对象序列化与反序列化**:Xstream提供了一种直观的方式来映射Java类到XML元素和属性,以及XML元素和属性到Java类。通过简单的注解或配置,开发者可以控制序列化的过程,包括字段的命名、嵌套对象的处理等。 2....

    Xstream操作Xml与Json.doc

    Xstream 是一个 Java 库,用于处理 XML 文件的序列化和反序列化,同时也支持将 JavaBean 转换为 JSON 格式。它的核心理念是通过简单的 API 设计,使得 XML 序列化过程变得简洁,无需额外的映射文件或辅助类。 ### 1...

    xstream源码

    XStream是一个Java库,它能够将Java对象转换为XML,反之亦然,使得数据序列化和反序列化变得简单易行。XStream以其简洁的API和高效性能在许多项目中被广泛使用。在这个主题中,我们将深入探讨XStream 1.4.2版本的...

    xStream完整Jar包

    **XML 序列化与反序列化** XStream 的主要功能就是将 Java 对象序列化为 XML 和从 XML 反序列化回 Java 对象。序列化是将对象转换为 XML 字符串的过程,这有助于数据存储或传输。反序列化则相反,它将 XML 字符串...

    xstream1.4.15.JAR

    XStream 是一个流行的 Java 库,用于将对象序列化为 XML 和从 XML 反序列化回对象。这个库广泛应用于各种 Java 应用程序,尤其是那些需要在网络间传输或存储对象数据的情况。在标题提到的 "xstream1.4.15.JAR" 文件...

Global site tag (gtag.js) - Google Analytics