1a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden/*
2a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Copyright (C) 2012 The Android Open Source Project
3a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
4a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Licensed under the Apache License, Version 2.0 (the "License");
5a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * you may not use this file except in compliance with the License.
6a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * You may obtain a copy of the License at
7a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
8a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *      http://www.apache.org/licenses/LICENSE-2.0
9a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden *
10a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Unless required by applicable law or agreed to in writing, software
11a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * distributed under the License is distributed on an "AS IS" BASIS,
12a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * See the License for the specific language governing permissions and
14a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * limitations under the License.
15a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden */
16a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
17a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.ByteArrayInputStream;
18a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.ByteArrayOutputStream;
19a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.IOException;
20a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.ObjectInputStream;
21a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.ObjectOutputStream;
22a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenimport java.io.Serializable;
23a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
24a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden/**
25a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden * Exercise serialization.
26a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden */
27a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenpublic class Main {
28a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
29a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public static void main(String[] args) {
30a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        testObjectSerialization();
31a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
32a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
33a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void testObjectSerialization() {
34a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        byte[] serialData;
35a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
36a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
37a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            serialData = createStream();
38a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            checkStream(serialData);
39a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (IOException ioe) {
40a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            throw new RuntimeException(ioe);
41a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
42a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
43a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
44a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static byte[] createStream() throws IOException {
45a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
46a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        ObjectOutputStream objStream = new ObjectOutputStream(byteStream);
47a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
48a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Sub sub = new Sub('X');
49a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        objStream.writeObject(sub);
50a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        byte[] bytes = byteStream.toByteArray();
51a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
52a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        objStream.close();
53a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        byteStream.close();
54a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        return bytes;
55a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
56a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
57a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    static void checkStream(byte[] input) throws IOException {
58a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        ByteArrayInputStream byteStream = new ByteArrayInputStream(input);
59a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        ObjectInputStream objStream = new ObjectInputStream(byteStream);
60a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
61a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        Sub sub;
62a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        try {
63a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            sub = (Sub) objStream.readObject();
64a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        } catch (ClassNotFoundException cnfe) {
65a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            throw new RuntimeException(cnfe);
66a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        }
67a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
68a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        objStream.close();
69a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        byteStream.close();
70a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
71a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        sub.check();
72a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
73a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden}
74a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
75a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenclass Base implements Serializable {
76a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    private static final long serialVersionUID = 12345;
77a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
78a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Boolean one;
79a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Integer two;
80a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    String three;
81a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
82a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public Base() {
83a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        one = true;
84a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        two = Integer.valueOf(2);
85a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        three = "three";
86a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
87a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden}
88a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
89a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFaddenclass Sub extends Base {
90a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    private static final long serialVersionUID = 54321;
91a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
92a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Double four;
93a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Float five;
94a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    private Byte six = 26;
95a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Character seven = '7';
96a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    Short eight;
97a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    long nine;
98a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public Character thing;
99a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
100a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public Sub(char thing) {
101a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        four = 4.0;
102a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        five = 5.0f;
103a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        six = 6;
104a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        eight = 8;
105a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        nine = 9;
106a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        this.thing = thing;
107a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
108a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
109a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    public void check() {
110a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden        System.out.println("one=" + one + " two=" + two + " three=" + three
111a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + " four=" + four + " five=" + five + " six=" + six
112a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + " seven=" + seven + " eight=" + eight + " nine=" + nine
113a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden            + " thing=" + thing);
114a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden    }
115a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden}
116a5a184892e60a89b564ca7c74e50b2ecb27d9f80Andy McFadden
117