使用了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中xml与javaBean的互转
// 检查反序列化的对象是否与原始对象一致 System.out.println(deserializedPerson.getName() + ", " + deserializedPerson.getSurname() + ", " + deserializedPerson.getAge()); } } ``` 在上述代码中,`...
虽然Xstream在小规模数据的反序列化上表现更快,但与Bboss相比,其优势并不明显。 对于大负荷数据,由于没有提供具体的结果,我们无法直接比较两个库的性能。然而,可以推测随着数据规模的增加,两个库的性能差距...
以下是如何使用XStream进行序列化和反序列化的简单步骤: 1. **序列化对象**: 为了序列化对象,你需要创建一个`XStream`实例,然后使用`toXML`方法将对象转换为XML字符串。例如,在`Writer`类中,可以创建一个`...
标题提到的"xstream-1.1.3正反序列化JAVA对象"是指使用XStream 1.1.3版本来处理Java对象的序列化和反序列化操作。XStream的核心功能在于它可以将复杂的Java对象结构轻松地映射到XML结构上,这使得数据交换和持久化变...
在本文中,我们将深入探讨XStream库的反序列化流程,这是一个流行的Java库,用于将XML数据转换为Java对象和反之亦然。XStream的反序列化过程涉及到多个步骤,从接收XML字符串到最终创建Java对象。以下是详细的分析:...
亿赛通电子文档安全管理系统存在XStream反序列化远程代码执行漏洞,攻击者可利用该漏洞对服务器上传任意文件,进而控制服务器权限。 使用 帮助信息 $ java -jar CDGXStreamDeserRCE.jar 亿赛通电子文档安全管理...
亿赛通电子文档安全管理系统XStream反序列化漏洞任意文件上传利用_CDGXStreamDeserRCE
使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...
XStream 是一个用 Java 编写的库,它提供了一种简单且高效的方式来序列化和反序列化对象到XML,反之亦然。这个API手册是针对XStream 1.3版本的,包含了详细的使用指南和技术信息,旨在帮助开发者更深入地理解和应用...
- **XML序列化与反序列化**:使用第三方库如XStream,可以将对象序列化为XML格式,也可以从XML反序列化回对象。这在需要以更结构化的方式存储或传输对象时非常有用。 ```java XStream xstream = new XStream(new ...
但是,XStream库能够自动处理这种情况,将关联的`Address`对象也序列化到XML中。 在这个实验中,学习了如何利用第三方库实现Java对象到XML的序列化。XStream库的使用简化了这个过程,使得我们可以方便地在Java对象...
在提供的压缩包中,`sample.xml`可能是使用XStream序列化后的Java对象示例,而`src`目录可能包含了相关的Java源代码,供学习和参考。通过研究这些文件,你可以更深入地理解XStream的工作原理和使用方式。
1. 数据存储与恢复:在持久化数据场景中,Xstream.Core可以将对象序列化为XML文件,然后在需要时反序列化回对象,便于数据的保存和读取。 2. 网络通信:在网络通信中,XML格式的数据交换是一种常见方式。Xstream....
在Android中,我们可以使用`javax.xml.bind`包中的`Marshaller`和`Unmarshaller`接口来进行XML的序列化和反序列化。不过,由于Android原生API中并未包含这部分内容,我们需要引入额外的库,如Jackson、Gson或XStream...
1. **对象序列化与反序列化**:Xstream提供了一种直观的方式来映射Java类到XML元素和属性,以及XML元素和属性到Java类。通过简单的注解或配置,开发者可以控制序列化的过程,包括字段的命名、嵌套对象的处理等。 2....
Xstream 是一个 Java 库,用于处理 XML 文件的序列化和反序列化,同时也支持将 JavaBean 转换为 JSON 格式。它的核心理念是通过简单的 API 设计,使得 XML 序列化过程变得简洁,无需额外的映射文件或辅助类。 ### 1...
XStream是一个Java库,它能够将Java对象转换为XML,反之亦然,使得数据序列化和反序列化变得简单易行。XStream以其简洁的API和高效性能在许多项目中被广泛使用。在这个主题中,我们将深入探讨XStream 1.4.2版本的...
**XML 序列化与反序列化** XStream 的主要功能就是将 Java 对象序列化为 XML 和从 XML 反序列化回 Java 对象。序列化是将对象转换为 XML 字符串的过程,这有助于数据存储或传输。反序列化则相反,它将 XML 字符串...
XStream 是一个流行的 Java 库,用于将对象序列化为 XML 和从 XML 反序列化回对象。这个库广泛应用于各种 Java 应用程序,尤其是那些需要在网络间传输或存储对象数据的情况。在标题提到的 "xstream1.4.15.JAR" 文件...