X-Git-Url: http://git.nikiroo.be/?a=blobdiff_plain;f=src%2Fbe%2Fnikiroo%2Futils%2Fserial%2FCustomSerializer.java;h=be89316eae07b74f6a67ccaeb589641ba81f8cea;hb=f4053377fa15da2f11e82955bfab86e673fa371c;hp=b6928eec7685b853aff33537cd2844e0bfcc24d8;hpb=db31c35860081535d6e7ddc83ab4af573bb0522e;p=nikiroo-utils.git diff --git a/src/be/nikiroo/utils/serial/CustomSerializer.java b/src/be/nikiroo/utils/serial/CustomSerializer.java index b6928ee..be89316 100644 --- a/src/be/nikiroo/utils/serial/CustomSerializer.java +++ b/src/be/nikiroo/utils/serial/CustomSerializer.java @@ -1,41 +1,59 @@ package be.nikiroo.utils.serial; +import java.io.IOException; + public abstract class CustomSerializer { protected abstract String toString(Object value); - protected abstract Object fromString(String content); + protected abstract Object fromString(String content) throws IOException; protected abstract String getType(); - public void encode(StringBuilder builder, Object value) { + /** + * Encode the object into the given builder if possible (if supported). + * + * @param builder + * the builder to append to + * @param value + * the object to encode + * @return TRUE if success, FALSE if not (the content of the builder won't + * be changed in case of failure) + */ + public boolean encode(StringBuilder builder, Object value) { + int prev = builder.length(); String customString = toString(value); - builder.append("custom:").append(getType()).append(":"); - SerialUtils.encode(builder, customString); + builder.append("custom^").append(getType()).append("^"); + if (!SerialUtils.encode(builder, customString)) { + builder.delete(prev, builder.length()); + return false; + } + + return true; } - public Object decode(String encodedValue) { + public Object decode(String encodedValue) throws IOException { return fromString((String) SerialUtils.decode(contentOf(encodedValue))); } public static boolean isCustom(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); - return pos1 >= 0 && pos2 >= 0 && encodedValue.startsWith("custom:"); + return pos1 >= 0 && pos2 >= 0 && encodedValue.startsWith("custom^"); } public static String typeOf(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); String type = encodedValue.substring(pos1 + 1, pos2); return type; } public static String contentOf(String encodedValue) { - int pos1 = encodedValue.indexOf(':'); - int pos2 = encodedValue.indexOf(':', pos1 + 1); + int pos1 = encodedValue.indexOf('^'); + int pos2 = encodedValue.indexOf('^', pos1 + 1); String encodedContent = encodedValue.substring(pos2 + 1); return encodedContent;