package be.nikiroo.utils.serial;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.NotSerializableException;
import be.nikiroo.utils.IOUtils;
import be.nikiroo.utils.Image;
-import be.nikiroo.utils.NextableInputStream;
-import be.nikiroo.utils.NextableInputStreamStep;
+import be.nikiroo.utils.streams.NextableInputStream;
+import be.nikiroo.utils.streams.NextableInputStreamStep;
import be.nikiroo.utils.StringUtils;
/**
type = type.substring(0, type.length() - 2); // remove the []
write(out, type);
- write(out, "\n");
+ write(out, "\r");
try {
for (int i = 0; true; i++) {
Object item = Array.get(value, i);
// encode it normally if direct value
if (!SerialUtils.encode(out, item)) {
try {
- // TODO: use ZIP: if not?
- new Exporter(out).append(item);
+ // TODO: bad escaping?
+ write(out, "B64:");
+ OutputStream bout = StringUtils.base64(out,
+ false, false);
+ new Exporter(bout).append(item);
} catch (NotSerializableException e) {
throw new UnknownFormatConversionException(e
.getMessage());
}
}
- write(out, "\n");
+ write(out, "\r");
}
} catch (ArrayIndexOutOfBoundsException e) {
// Done.
@Override
protected Object fromStream(InputStream in) throws IOException {
NextableInputStream stream = new NextableInputStream(in,
- new NextableInputStreamStep('\n'));
+ new NextableInputStreamStep('\r'));
try {
List<Object> list = new ArrayList<Object>();
// URL:
customTypes.put("java.net.URL", new CustomSerializer() {
-
@Override
protected void toStream(OutputStream out, Object value)
throws IOException {
ctor = clazz.getDeclaredConstructor(classes
.toArray(new Class[] {}));
} catch (NoSuchMethodException nsme) {
- // TODO: it seems e do not always need a parameter for each
+ // TODO: it seems we do not always need a parameter for each
// level, so we currently try "ALL" levels or "FIRST" level
// only -> we should check the actual rule and use it
ctor = clazz.getDeclaredConstructor(classes.get(0));
// custom:TYPE_NAME:"content is String-encoded"
String type = CustomSerializer.typeOf(encodedValue);
if (customTypes.containsKey(type)) {
- return customTypes.get(type).decode(encodedValue);
+ // TODO: we should start with a stream
+ InputStream streamEncodedValue = new ByteArrayInputStream(
+ encodedValue.getBytes("UTF-8"));
+ try {
+ return customTypes.get(type).decode(streamEncodedValue);
+ } finally {
+ streamEncodedValue.close();
+ }
}
throw new IOException("Unknown custom type: " + type);
} else if (encodedValue.equals("NULL")
static void encodeString(OutputStream out, InputStream raw)
throws IOException {
out.write('\"');
- byte buffer[] = new byte[4069];
+ byte buffer[] = new byte[4096];
for (int len = 0; (len = raw.read(buffer)) > 0;) {
for (int i = 0; i < len; i++) {
// TODO: not 100% correct, look up howto for UTF-8