1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2000, 2015 Oracle and/or its affiliates. All rights reserved.
*
*/
package com.sleepycat.bind.serial;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import com.sleepycat.db.DatabaseException;
import com.sleepycat.util.ClassResolver;
import com.sleepycat.util.RuntimeExceptionWrapper;
/**
* A specialized <code>ObjectInputStream</code> that gets class description
* information from a <code>ClassCatalog</code>. It is used by
* <code>SerialBinding</code>.
*
* <p>This class is used instead of an {@link ObjectInputStream}, which it
* extends, to read an object stream written by the {@link SerialOutput} class.
* For reading objects from a database normally one of the serial binding
* classes is used. {@link SerialInput} is used when an {@link
* ObjectInputStream} is needed along with compact storage. A {@link
* ClassCatalog} must be supplied, however, to stored shared class
* descriptions.</p>
*
* @see <a href="SerialBinding.html#evolution">Class Evolution</a>
*
* @author Mark Hayes
*/
public class SerialInput extends ClassResolver.Stream {
private ClassCatalog classCatalog;
/**
* Creates a serial input stream.
*
* @param in is the input stream from which compact serialized objects will
* be read.
*
* @param classCatalog is the catalog containing the class descriptions
* for the serialized objects.
*/
public SerialInput(InputStream in, ClassCatalog classCatalog)
throws IOException {
this(in, classCatalog, null);
}
/**
* Creates a serial input stream.
*
* @param in is the input stream from which compact serialized objects will
* be read.
*
* @param classCatalog is the catalog containing the class descriptions
* for the serialized objects.
*
* @param classLoader is the class loader to use, or null if a default
* class loader should be used.
*/
public SerialInput(InputStream in,
ClassCatalog classCatalog,
ClassLoader classLoader)
throws IOException {
super(in, classLoader);
this.classCatalog = classCatalog;
}
@Override
protected ObjectStreamClass readClassDescriptor()
throws IOException, ClassNotFoundException {
try {
byte len = readByte();
byte[] id = new byte[len];
readFully(id);
return classCatalog.getClassFormat(id);
} catch (DatabaseException e) {
/*
* Do not throw IOException from here since ObjectOutputStream
* will write the exception to the stream, which causes another
* call here, etc.
*/
throw RuntimeExceptionWrapper.wrapIfNeeded(e);
}
}
}
|