📄 xstream.java
字号:
package com.thoughtworks.xstream;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.basic.*;import com.thoughtworks.xstream.converters.collections.*;import com.thoughtworks.xstream.converters.extended.*;import com.thoughtworks.xstream.converters.reflection.ExternalizableConverter;import com.thoughtworks.xstream.converters.reflection.ReflectionConverter;import com.thoughtworks.xstream.converters.reflection.ReflectionProvider;import com.thoughtworks.xstream.converters.reflection.SerializableConverter;import com.thoughtworks.xstream.core.*;import com.thoughtworks.xstream.core.util.ClassLoaderReference;import com.thoughtworks.xstream.core.util.CompositeClassLoader;import com.thoughtworks.xstream.core.util.CustomObjectInputStream;import com.thoughtworks.xstream.core.util.CustomObjectOutputStream;import com.thoughtworks.xstream.io.HierarchicalStreamDriver;import com.thoughtworks.xstream.io.HierarchicalStreamReader;import com.thoughtworks.xstream.io.HierarchicalStreamWriter;import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;import com.thoughtworks.xstream.io.xml.XppDriver;import com.thoughtworks.xstream.mapper.*;import java.io.*;import java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.math.BigDecimal;import java.math.BigInteger;import java.net.URL;import java.sql.Time;import java.sql.Timestamp;import java.util.*;/** * Simple facade to XStream library, a Java-XML serialization tool. * <p/> * <p><hr><b>Example</b><blockquote><pre> * XStream xstream = new XStream(); * String xml = xstream.toXML(myObject); // serialize to XML * Object myObject2 = xstream.fromXML(xml); // deserialize from XML * </pre></blockquote><hr> * <p/> * <h3>Aliasing classes</h3> * <p/> * <p>To create shorter XML, you can specify aliases for classes using * the <code>alias()</code> method. * For example, you can shorten all occurences of element * <code><com.blah.MyThing></code> to * <code><my-thing></code> by registering an alias for the class. * <p><hr><blockquote><pre> * xstream.alias("my-thing", MyThing.class); * </pre></blockquote><hr> * <p/> * <h3>Converters</h3> * <p/> * <p>XStream contains a map of {@link com.thoughtworks.xstream.converters.Converter} * instances, each of which acts as a strategy for converting a particular type * of class to XML and back again. Out of the box, XStream contains converters * for most basic types (String, Date, int, boolean, etc) and collections (Map, List, * Set, Properties, etc). For other objects reflection is used to serialize * each field recursively.</p> * <p/> * <p>Extra converters can be registered using the <code>registerConverter()</code> * method. Some non-standard converters are supplied in the * {@link com.thoughtworks.xstream.converters.extended} package and you can create * your own by implementing the {@link com.thoughtworks.xstream.converters.Converter} * interface.</p> * <p/> * <p><hr><b>Example</b><blockquote><pre> * xstream.registerConverter(new SqlTimestampConverter()); * xstream.registerConverter(new DynamicProxyConverter()); * </pre></blockquote><hr> * <p>The default converter, ie the converter which will be used if no other registered * converter is suitable, can be configured by either one of the constructors * or can be changed using the <code>changeDefaultConverter()</code> method. * If not set, XStream uses {@link com.thoughtworks.xstream.converters.reflection.ReflectionConverter} * as the initial default converter. * </p> * <p/> * <p><hr><b>Example</b><blockquote><pre> * xstream.changeDefaultConverter(new ACustomDefaultConverter()); * </pre></blockquote><hr> * <p/> * <h3>Object graphs</h3> * <p/> * <p>XStream has support for object graphs; a deserialized object graph * will keep references intact, including circular references.</p> * <p/> * <p>XStream can signify references in XML using either XPath or IDs. The * mode can be changed using <code>setMode()</code>:</p> * <p/> * <table border="1"> * <tr> * <td><code>xstream.setMode(XStream.XPATH_REFERENCES);</code></td> * <td><i>(Default)</i> Uses XPath references to signify duplicate * references. This produces XML with the least clutter.</td> * </tr> * <tr> * <td><code>xstream.setMode(XStream.ID_REFERENCES);</code></td> * <td>Uses ID references to signify duplicate references. In some * scenarios, such as when using hand-written XML, this is * easier to work with.</td> * </tr> * <tr> * <td><code>xstream.setMode(XStream.NO_REFERENCES);</code></td> * <td>This disables object graph support and treats the object * structure like a tree. Duplicate references are treated * as two seperate objects and circular references cause an * exception. This is slightly faster and uses less memory * than the other two modes.</td> * </tr> * </table> * * <h3>Thread safety</h3> * * <p>The XStream instance is thread-safe. That is, once the XStream instance * has been created and configured, it may be shared across multiple threads * allowing objects to be serialized/deserialized concurrently. * * <h3>Implicit collections</h3> * <p/> * <p>To avoid the need for special tags for collections, you can define implicit collections using one of the * <code>addImplicitCollection</code> methods.</p> * * @author Joe Walnes * @author Mauro Talevi */public class XStream { private ClassAliasingMapper classAliasingMapper; private FieldAliasingMapper fieldAliasingMapper; private DefaultImplementationsMapper defaultImplementationsMapper; private ImmutableTypesMapper immutableTypesMapper; private ImplicitCollectionMapper implicitCollectionMapper; private ReflectionProvider reflectionProvider; private HierarchicalStreamDriver hierarchicalStreamDriver; private MarshallingStrategy marshallingStrategy; private ClassLoaderReference classLoaderReference; // TODO: Should be changeable private ClassMapper classMapper; private DefaultConverterLookup converterLookup; private JVM jvm = new JVM(); public static final int NO_REFERENCES = 1001; public static final int ID_REFERENCES = 1002; public static final int XPATH_REFERENCES = 1003; private static final int PRIORITY_NORMAL = 0; private static final int PRIORITY_LOW = -10; private static final int PRIORITY_VERY_LOW = -20; public XStream() { this(null, null, new XppDriver()); } /** * @deprecated As of XStream 1.1.1, a default Converter is unnecessary as you can register a Converter with an * associated priority. Use an alternate constructor. */ public XStream(Converter defaultConverter) { this(null, null, new XppDriver(), null); registerConverter(defaultConverter, PRIORITY_VERY_LOW); } public XStream(HierarchicalStreamDriver hierarchicalStreamDriver) { this(null, null, hierarchicalStreamDriver); } public XStream(ReflectionProvider reflectionProvider) { this(reflectionProvider, null, new XppDriver()); } public XStream(ReflectionProvider reflectionProvider, HierarchicalStreamDriver hierarchicalStreamDriver) { this(reflectionProvider, null, hierarchicalStreamDriver); } public XStream(ReflectionProvider reflectionProvider, ClassMapper classMapper, HierarchicalStreamDriver driver) { this(reflectionProvider, classMapper, driver, null); } public XStream(ReflectionProvider reflectionProvider, ClassMapper classMapper, HierarchicalStreamDriver driver, String classAttributeIdentifier) { jvm = new JVM(); if (reflectionProvider == null) { reflectionProvider = jvm.bestReflectionProvider(); } this.reflectionProvider = reflectionProvider; this.hierarchicalStreamDriver = driver; this.classLoaderReference = new ClassLoaderReference(new CompositeClassLoader()); this.classMapper = classMapper == null ? buildMapper(classAttributeIdentifier) : classMapper; converterLookup = new DefaultConverterLookup(this.classMapper); setupAliases(); setupDefaultImplementations(); setupConverters(); setupImmutableTypes(); setMode(XPATH_REFERENCES); } /** * @deprecated As of XStream 1.1.1, a default Converter is unnecessary as you can register a Converter with an * associated priority. Use an alternate constructor. */ public XStream(ReflectionProvider reflectionProvider, ClassMapper classMapper, HierarchicalStreamDriver driver, String classAttributeIdentifier, Converter defaultConverter) { this(reflectionProvider, classMapper, driver, classAttributeIdentifier); registerConverter(defaultConverter, PRIORITY_VERY_LOW); } private ClassMapper buildMapper(String classAttributeIdentifier) { MapperWrapper mapper = new DefaultMapper(classLoaderReference, classAttributeIdentifier); mapper = new XmlFriendlyMapper(mapper); mapper = new ClassAliasingMapper(mapper); classAliasingMapper = (ClassAliasingMapper) mapper; // need a reference to that one mapper = new FieldAliasingMapper(mapper); fieldAliasingMapper = (FieldAliasingMapper) mapper; // need a reference to that one mapper = new ImplicitCollectionMapper(mapper); implicitCollectionMapper = (ImplicitCollectionMapper)mapper; // need a reference to this one mapper = new DynamicProxyMapper(mapper); if (JVM.is15()) { mapper = new EnumMapper(mapper); } mapper = new OuterClassMapper(mapper); mapper = new ArrayMapper(mapper); mapper = new DefaultImplementationsMapper(mapper); defaultImplementationsMapper = (DefaultImplementationsMapper) mapper; // and that one mapper = new ImmutableTypesMapper(mapper); immutableTypesMapper = (ImmutableTypesMapper)mapper; // that one too mapper = wrapMapper(mapper); mapper = new CachingMapper(mapper); return mapper; } protected MapperWrapper wrapMapper(MapperWrapper next) { return next; } protected void setupAliases() { alias("null", ClassMapper.Null.class); alias("int", Integer.class); alias("float", Float.class); alias("double", Double.class); alias("long", Long.class); alias("short", Short.class); alias("char", Character.class); alias("byte", Byte.class); alias("boolean", Boolean.class); alias("number", Number.class); alias("object", Object.class); alias("big-int", BigInteger.class); alias("big-decimal", BigDecimal.class); alias("string-buffer", StringBuffer.class); alias("string", String.class); alias("java-class", Class.class); alias("method", Method.class); alias("constructor", Constructor.class); alias("date", Date.class); alias("url", URL.class); alias("bit-set", BitSet.class); alias("map", Map.class); alias("entry", Map.Entry.class); alias("properties", Properties.class); alias("list", List.class); alias("set", Set.class); alias("linked-list", LinkedList.class); alias("vector", Vector.class); alias("tree-map", TreeMap.class); alias("tree-set", TreeSet.class); alias("hashtable", Hashtable.class); // Instantiating these two classes starts the AWT system, which is undesirable. Calling loadClass ensures // a reference to the class is found but they are not instantiated. alias("awt-color", jvm.loadClass("java.awt.Color")); alias("awt-font", jvm.loadClass("java.awt.Font")); alias("sql-timestamp", Timestamp.class); alias("sql-time", Time.class); alias("sql-date", java.sql.Date.class); alias("file", File.class); alias("locale", Locale.class); alias("gregorian-calendar", Calendar.class); if (JVM.is14()) { alias("linked-hash-map", jvm.loadClass("java.util.LinkedHashMap"));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -