treemarshaller.java
来自「xstream是一个把java object序列化成xml文件的开源库,轻便好用」· Java 代码 · 共 76 行
JAVA
76 行
package com.thoughtworks.xstream.core;import com.thoughtworks.xstream.alias.ClassMapper;import com.thoughtworks.xstream.converters.Converter;import com.thoughtworks.xstream.converters.ConverterLookup;import com.thoughtworks.xstream.converters.DataHolder;import com.thoughtworks.xstream.converters.MarshallingContext;import com.thoughtworks.xstream.core.util.ObjectIdDictionary;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import java.util.Iterator;public class TreeMarshaller implements MarshallingContext { protected HierarchicalStreamWriter writer; protected ConverterLookup converterLookup; protected ClassMapper classMapper; private ObjectIdDictionary parentObjects = new ObjectIdDictionary(); private DataHolder dataHolder; public TreeMarshaller(HierarchicalStreamWriter writer, ConverterLookup converterLookup, ClassMapper classMapper) { this.writer = writer; this.converterLookup = converterLookup; this.classMapper = classMapper; } public void convertAnother(Object item) { if (parentObjects.containsId(item)) { throw new CircularReferenceException(); } parentObjects.associateId(item, ""); Converter converter = converterLookup.lookupConverterForType(item.getClass()); converter.marshal(item, writer, this); parentObjects.removeId(item); } public void start(Object item, DataHolder dataHolder) { this.dataHolder = dataHolder; if (item == null) { writer.startNode(classMapper.serializedClass(ClassMapper.Null.class)); writer.endNode(); } else { writer.startNode(classMapper.serializedClass(item.getClass())); convertAnother(item); writer.endNode(); } } public Object get(Object key) { lazilyCreateDataHolder(); return dataHolder.get(key); } public void put(Object key, Object value) { lazilyCreateDataHolder(); dataHolder.put(key, value); } public Iterator keys() { lazilyCreateDataHolder(); return dataHolder.keys(); } private void lazilyCreateDataHolder() { if (dataHolder == null) { dataHolder = new MapBackedDataHolder(); } } public static class CircularReferenceException extends RuntimeException { }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?