Class PersistenceService
This class uses the classes XMLEncoder and
XMLDecoder to encode and decode an object
to and from an XML file for long term persistence.
It allows you to provide custom PersistenceDelegate
instances for the serialisation of any classes which do not implement the
JavaBean design pattern and are not supported by XMLEncoder
as a default.
For the latter case, PersistenceService offers the
setPersistenceDelegate(Class, PersistenceDelegate) method which
could be called from a static initialiser block in the class which would
like to use PersistenceService's store and load
methods.
Note that the Java API already provides some default persistence delegates
for some classes of its API which are not JavaBeans. If in doubt, simply
test the class before writing a custom PersistenceDelegate.
If you see exceptions happening, you most probably need to provide a
PersistenceDelegate and use the setPersistenceDelegate
method to install it.
Note that the store and load methods in this class have been designed
to deal with any kind of Throwables throughout the course of
(de)serialisation, even OutOfMemoryErrors.
This class is designed to be thread safe, i.e. when an object is
persistet, it is put into a synchronized (object) { ... } block.
- Author:
- Christian Schlichtherle
- See Also:
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic intThe buffer size for I/O used in the store and load methods.static final int10KB - the default buffer size for buffered I/O.static final String"UTF-8"- the character encoding used byXMLEncoderandXMLDecoder. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected static voidinstallPersistenceDelegates(Encoder encoder) Installs all persistence delegates registered via{@link #setPersistenceDelegate(Class, PersistenceDelegate)}inencoder.static Objectload(byte[] encoded) Loads a single object, which may form the root of an entire object graph, from XML content in the UTF-8 encoded byte arrayencoded.static ObjectLoads a single object, which may form the root of an entire object graph, from XML content in the given filefile.static Objectload(InputStream xmlIn) Loads a single object, which may form the root of an entire object graph, from XML content in the given input streamxmlIn.static ObjectLoads a single object, which may form the root of an entire object graph, from XML content in the stringencoded.static final voidsetPersistenceDelegate(Class clazz, PersistenceDelegate persistenceDelegate) Associates aPersistenceDelegateto the given classtype.static voidStores the objectroot, which may form the root of an entire object graph, as XML content to the filefilefor long term persistence.static voidstore(Object root, OutputStream xmlOut) Stores the objectroot, which may form the root of an entire object graph, as XML content to the output streamxmlOutfor long term persistence.static byte[]store2ByteArray(Object root) Stores the objectroot, which may form the root of an entire object graph, as XML content into a UTF-8 encoded byte array for long term persistence.static Stringstore2String(Object root) Stores the objectroot, which may form the root of an entire object graph, as XML content into a string for long term persistence.
-
Field Details
-
BUFSIZE
public static int BUFSIZEThe buffer size for I/O used in the store and load methods. You may customise this to your needs - the default isDEFAULT_BUFSIZE. -
XML_CHARSET
"UTF-8"- the character encoding used byXMLEncoderandXMLDecoder.- See Also:
-
DEFAULT_BUFSIZE
static final int DEFAULT_BUFSIZE10KB - the default buffer size for buffered I/O.- See Also:
-
-
Constructor Details
-
PersistenceService
protected PersistenceService()You cannot instantiate this class.
-
-
Method Details
-
setPersistenceDelegate
public static final void setPersistenceDelegate(Class clazz, PersistenceDelegate persistenceDelegate) Associates aPersistenceDelegateto the given classtype.This must be called prior to the
storemethods for each class which's instances are to be persisted. Thus, the best place to put this call in is a static initializer block for the corresponding class.Here is an example:
class PersistentObject { static { PersistenceService.setPersistenceDelegate( PersistentObject.class, new DefaultPersistenceDelegate( new String[] { "property" })); } public int property; public PersistentObject(int property) { this.property = property; } }Note that you should not use this method for any class which's source code you can control. The preferred way to associate a persistence delegate with a class is to write a
BeanInfoclass which'sBeanDescriptorhas an attribute set with"persistenceDelegate"as its name and the respective persistence delegate as its value (seeEncoder.getPersistenceDelegate(java.lang.Class<?>)). However, this method is still useful in case you can't control the source code, as then at least you can still associate a persistence delegate to this class. -
installPersistenceDelegates
Installs all persistence delegates registered via{@link #setPersistenceDelegate(Class, PersistenceDelegate)}inencoder.- Parameters:
encoder- The encoder - may not benull.- Throws:
RuntimeException- ifencoderisnull.
-
store
public static void store(Object root, OutputStream xmlOut) throws NullPointerException, PersistenceServiceException Stores the objectroot, which may form the root of an entire object graph, as XML content to the output streamxmlOutfor long term persistence.Please note the following:
- This method will not tolerate any I/O or other serialisation exceptions!
- The underlying stream is always closed (even if an exception is thrown).
- Parameters:
root- The object to store - may benull.xmlOut- The unbuffered stream to output the XML content - may not benull.- Throws:
NullPointerException- IfxmlOutis }null}.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
store
public static void store(Object root, File file) throws NullPointerException, PersistenceServiceException Stores the objectroot, which may form the root of an entire object graph, as XML content to the filefilefor long term persistence. This method supports writing to a file located in a ZIP or JAR file.Please note the following:
- This method will not tolerate any I/O or other serialisation exceptions!
- This is a transaction, i.e. the method either completely succeeds with saving the file or the file is restored to its original state.
- Parameters:
root- The object to store - may benull.file- The file to output the XML content to - may not benull.- Throws:
NullPointerException- Iffileis }null}.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
store2ByteArray
Stores the objectroot, which may form the root of an entire object graph, as XML content into a UTF-8 encoded byte array for long term persistence.Please note the following:
- This method will not tolerate any I/O or other serialisation exceptions!
- Parameters:
root- The object to store - may benull.- Returns:
- The XML with UTF-8 charset encoded byte array
representation of
root-nullis never returned. - Throws:
PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
store2String
Stores the objectroot, which may form the root of an entire object graph, as XML content into a string for long term persistence.Please note the following:
- This method will not tolerate any I/O or other serialisation exceptions!
- Parameters:
root- The object to store - may benull.- Returns:
- The XML string encoded representation of
root-nullis never returned. - Throws:
PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
load
public static Object load(InputStream xmlIn) throws NullPointerException, PersistenceServiceException Loads a single object, which may form the root of an entire object graph, from XML content in the given input streamxmlIn.Please note the following:
- The stream is connected to a new
BufferedInputStreamwithBUFSIZEas its buffer size and is always closed (even if an exception is thrown). - This method will not tolerate any I/O or other deserialisation exceptions!
- Parameters:
xmlIn- The unbuffered stream to input the XML content - may not benull.- Returns:
- The root of the loaded object graph - may be
null. - Throws:
NullPointerException- IfxmlInisnull.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
- The stream is connected to a new
-
load
Loads a single object, which may form the root of an entire object graph, from XML content in the given filefile.Please note the following:
- This method will not tolerate any I/O or other deserialisation exceptions!
- Parameters:
file- The file to load the XML content from - may not benull.- Returns:
- The root of the loaded object graph - may be
null. - Throws:
NullPointerException- Iffileisnull.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
load
Loads a single object, which may form the root of an entire object graph, from XML content in the UTF-8 encoded byte arrayencoded.Please note the following:
- This method will not tolerate any I/O or other deserialisation exceptions!
- Parameters:
encoded- The XML with UTF-8 charset encoded byte array representation of the root of an object graph - may not benull.- Returns:
- The root of the loaded object graph - may be
null. - Throws:
NullPointerException- Ifencodedisnull.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-
load
Loads a single object, which may form the root of an entire object graph, from XML content in the stringencoded.Please note the following:
- This method will not tolerate any I/O or other deserialisation exceptions!
- Parameters:
encoded- The XML string encoded representation of the root of an object graph - may not benull.- Returns:
- The root of the loaded object graph - may be
null. - Throws:
NullPointerException- Ifencodedisnull.PersistenceServiceException- If any throwable was thrown during serialisation. Its cause is always set.
-