• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Javassist, a Java-bytecode translator toolkit.
3  * Copyright (C) 1999-2010 Shigeru Chiba. All Rights Reserved.
4  *
5  * The contents of this file are subject to the Mozilla Public License Version
6  * 1.1 (the "License"); you may not use this file except in compliance with
7  * the License.  Alternatively, the contents of this file may be used under
8  * the terms of the GNU Lesser General Public License Version 2.1 or later.
9  *
10  * Software distributed under the License is distributed on an "AS IS" basis,
11  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12  * for the specific language governing rights and limitations under the
13  * License.
14  */
15 
16 package javassist.util.proxy;
17 
18 import java.io.IOException;
19 import java.io.ObjectOutputStream;
20 import java.io.ObjectStreamClass;
21 import java.io.OutputStream;
22 
23 /**
24  * An input stream class which knows how to serialize proxies created via {@link ProxyFactory}. It must
25  * be used when serialising proxies created from a proxy factory configured with
26  * {@link ProxyFactory#useWriteReplace} set to false. Subsequent deserialization of the serialized data
27  * must employ a {@link ProxyObjectInputStream}
28  *
29  * @author Andrew Dinn
30  */
31 public class ProxyObjectOutputStream extends ObjectOutputStream
32 {
33     /**
34      * create an output stream which can be used to serialize an object graph which includes proxies created
35      * using class ProxyFactory
36      * @param out
37      * @throws IOException whenever ObjectOutputStream would also do so
38      * @throws SecurityException whenever ObjectOutputStream would also do so
39      * @throws NullPointerException if out is null
40      */
ProxyObjectOutputStream(OutputStream out)41     public ProxyObjectOutputStream(OutputStream out) throws IOException
42     {
43         super(out);
44     }
45 
writeClassDescriptor(ObjectStreamClass desc)46     protected void writeClassDescriptor(ObjectStreamClass desc) throws IOException {
47         Class cl = desc.forClass();
48         if (ProxyFactory.isProxyClass(cl)) {
49             writeBoolean(true);
50             Class superClass = cl.getSuperclass();
51             Class[] interfaces = cl.getInterfaces();
52             byte[] signature = ProxyFactory.getFilterSignature(cl);
53             String name = superClass.getName();
54             writeObject(name);
55             // we don't write the marker interface ProxyObject
56             writeInt(interfaces.length - 1);
57             for (int i = 0; i < interfaces.length; i++) {
58                 Class interfaze = interfaces[i];
59                 if (interfaze != ProxyObject.class) {
60                     name = interfaces[i].getName();
61                     writeObject(name);
62                 }
63             }
64             writeInt(signature.length);
65             write(signature);
66         } else {
67             writeBoolean(false);
68             super.writeClassDescriptor(desc);
69         }
70     }
71 }
72