X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2FCustomSerializer.java;h=fe63f71903619c6ae49f7fa8d765ddf0b2858f0a;hb=dce410fec00030c0affde7b19bcde6de847fae13;hp=e5539c0fdce8669592a932c819d458b0717c1613;hpb=08f80ac5fa60738d3ad74c4b5390a0b79ae313d4;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/CustomSerializer.java b/src/be/nikiroo/utils/serial/CustomSerializer.java index e5539c0..fe63f71 100644 --- a/src/be/nikiroo/utils/serial/CustomSerializer.java +++ b/src/be/nikiroo/utils/serial/CustomSerializer.java @@ -5,22 +5,80 @@ import java.io.InputStream; import java.io.OutputStream; import be.nikiroo.utils.IOUtils; +import be.nikiroo.utils.streams.BufferedInputStream; import be.nikiroo.utils.streams.NextableInputStream; import be.nikiroo.utils.streams.NextableInputStreamStep; import be.nikiroo.utils.streams.ReplaceInputStream; import be.nikiroo.utils.streams.ReplaceOutputStream; +/** + * A {@link CustomSerializer} supports and generates values in the form: + * + *

+ * In this scheme, the values are: + *

+ *

+ * To create a new {@link CustomSerializer}, you are expected to implement the + * abstract methods of this class. The rest should be taken care of bythe + * system. + * + * @author niki + */ public abstract class CustomSerializer { - + /** + * Generate the custom ENCODED_VALUE from this + * value. + *

+ * The value will always be of the supported type. + * + * @param out + * the {@link OutputStream} to write the value to + * @param value + * the value to serialize + * + * @throws IOException + * in case of I/O error + */ protected abstract void toStream(OutputStream out, Object value) throws IOException; + /** + * Regenerate the value from the custom ENCODED_VALUE. + *

+ * The value in the {@link InputStream} in will always be of the + * supported type. + * + * @param in + * the {@link InputStream} containing the + * ENCODED_VALUE + * + * @return the regenerated object + * + * @throws IOException + * in case of I/O error + */ protected abstract Object fromStream(InputStream in) throws IOException; + /** + * Return the supported type name. + *

+ * It must be the name returned by {@link Object#getClass() + * #getCanonicalName()}. + * + * @return the supported class name + */ protected abstract String getType(); /** - * Encode the object into the given {@link OutputStream} if supported. + * Encode the object into the given {@link OutputStream}. * * @param out * the builder to append to @@ -45,6 +103,17 @@ public abstract class CustomSerializer { } } + /** + * Decode the value back into the supported object type. + * + * @param in + * the encoded value + * + * @return the object + * + * @throws IOException + * in case of I/O error + */ public Object decode(InputStream in) throws IOException { ReplaceInputStream replace = new ReplaceInputStream(in, // new String[] { "\\\\", "\\n" }, // @@ -92,6 +161,8 @@ public abstract class CustomSerializer { } } + /** Use {@link CustomSerializer#isCustom(BufferedInputStream)}. */ + @Deprecated public static boolean isCustom(String encodedValue) { int pos1 = encodedValue.indexOf('^'); int pos2 = encodedValue.indexOf('^', pos1 + 1); @@ -99,6 +170,10 @@ public abstract class CustomSerializer { return pos1 >= 0 && pos2 >= 0 && encodedValue.startsWith("custom^"); } + public static boolean isCustom(BufferedInputStream in) throws IOException { + return in.startsWiths("custom^"); + } + public static String typeOf(String encodedValue) { int pos1 = encodedValue.indexOf('^'); int pos2 = encodedValue.indexOf('^', pos1 + 1); @@ -106,12 +181,4 @@ public abstract class CustomSerializer { return type; } - - public static String contentOf(String encodedValue) { - int pos1 = encodedValue.indexOf('^'); - int pos2 = encodedValue.indexOf('^', pos1 + 1); - String encodedContent = encodedValue.substring(pos2 + 1); - - return encodedContent; - } }