📄 burlapserializerfactory.java
字号:
/* * Copyright (c) 2001-2003 Caucho Technology, Inc. All rights reserved. * * The Apache Software License, Version 1.1 * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Caucho Technology (http://www.caucho.com/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Burlap", "Resin", and "Caucho" must not be used to * endorse or promote products derived from this software without prior * written permission. For written permission, please contact * info@caucho.com. * * 5. Products derived from this software may not be called "Resin" * nor may "Resin" appear in their names without prior written * permission of Caucho Technology. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL CAUCHO TECHNOLOGY OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * @author Scott Ferguson */package net.buffalo.service.invoker.burlap;import java.io.IOException;import java.math.BigDecimal;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Map;import com.caucho.burlap.io.AbstractBurlapInput;import com.caucho.burlap.io.ArrayDeserializer;import com.caucho.burlap.io.ArraySerializer;import com.caucho.burlap.io.BasicDeserializer;import com.caucho.burlap.io.BasicSerializer;import com.caucho.burlap.io.BurlapProtocolException;import com.caucho.burlap.io.BurlapRemoteObject;import com.caucho.burlap.io.ClassDeserializer;import com.caucho.burlap.io.ClassSerializer;import com.caucho.burlap.io.CollectionDeserializer;import com.caucho.burlap.io.CollectionSerializer;import com.caucho.burlap.io.Deserializer;import com.caucho.burlap.io.JavaDeserializer;import com.caucho.burlap.io.JavaSerializer;import com.caucho.burlap.io.MapDeserializer;import com.caucho.burlap.io.MapSerializer;import com.caucho.burlap.io.RemoteSerializer;import com.caucho.burlap.io.Serializer;import com.caucho.burlap.io.SerializerFactory;import com.caucho.burlap.io.SqlDateDeserializer;import com.caucho.burlap.io.StackTraceElementDeserializer;import com.caucho.burlap.io.StringValueDeserializer;import com.caucho.burlap.io.StringValueSerializer;/** * Factory for returning serialization methods. * * Note: this is a 'patched' version of the burlap's SerializerFactory, I do * this just for the resin app server. */public class BurlapSerializerFactory extends SerializerFactory { private static HashMap serializerMap; private static HashMap deserializerMap; private static HashMap typeMap; private Serializer defaultSerializer; /** * Returns the serializer for a class. * * @param cl * the class of the object that needs to be serialized. * * @return a serializer object which is do the serialization. */ public Serializer getSerializer(Class cl) throws BurlapProtocolException { Serializer serializer; serializer = (Serializer) serializerMap.get(cl); if (serializer != null) return serializer; if (BurlapRemoteObject.class.isAssignableFrom(cl)) return new RemoteSerializer(); if (Map.class.isAssignableFrom(cl)) return new MapSerializer(); if (Collection.class.isAssignableFrom(cl)) return new CollectionSerializer(); if (cl.isArray()) return new ArraySerializer(); return getDefaultSerializer(cl); } public Serializer getDefaultSerializer(Class cl) { if (defaultSerializer == null) defaultSerializer = new JavaSerializer(); return defaultSerializer; } public Deserializer getDeserializer(Class cl) throws BurlapProtocolException { Deserializer deserializer; deserializer = (Deserializer) deserializerMap.get(cl); if (deserializer != null) return deserializer; if (cl == null || Object.class.equals(cl)) return new MapDeserializer(null); if (Collection.class.isAssignableFrom(cl)) return new CollectionDeserializer(cl); if (Map.class.isAssignableFrom(cl)) return new MapDeserializer(cl); if (cl.isArray()) { return new ArrayDeserializer(getDeserializer(cl.getComponentType())); } return new JavaDeserializer(cl); } public Object readList(AbstractBurlapInput in, int length, String type) throws BurlapProtocolException, IOException { Deserializer deserializer = getDeserializer(type); if (deserializer != null) return deserializer.readList(in, length); else return new CollectionDeserializer(ArrayList.class).readList(in, length); } public Object readMap(AbstractBurlapInput in, String type) throws BurlapProtocolException, IOException { Deserializer deserializer = getDeserializer(type); if (deserializer != null) return deserializer.readMap(in); else return new MapDeserializer(HashMap.class).readMap(in); } public Deserializer getObjectDeserializer(String type) throws BurlapProtocolException { Deserializer deserializer = getDeserializer(type); if (deserializer != null) return deserializer; else return new MapDeserializer(HashMap.class); } public Deserializer getDeserializer(String type) throws BurlapProtocolException { if (type == null || type.equals("")) return null; Deserializer deserializer; deserializer = (Deserializer) typeMap.get(type); if (deserializer != null) { return deserializer; } if (type.startsWith("[")) { Deserializer subDeserializer = getDeserializer(type.substring(1)); return new ArrayDeserializer(subDeserializer); } try { ClassLoader loader = Thread.currentThread().getContextClassLoader(); Class cl = Class.forName(type, false, loader); return getDeserializer(cl); } catch (Exception e) { } return null; } private static void addBasic(Class cl, String typeName, int type) { serializerMap.put(cl, new BasicSerializer(type)); Deserializer deserializer = new BasicDeserializer(type); deserializerMap.put(cl, deserializer); typeMap.put(typeName, deserializer); } static { serializerMap = new HashMap(); deserializerMap = new HashMap(); typeMap = new HashMap(); addBasic(Boolean.class, "boolean", BasicSerializer.BOOLEAN); addBasic(Byte.class, "byte", BasicSerializer.BYTE); addBasic(Short.class, "short", BasicSerializer.SHORT); addBasic(Integer.class, "int", BasicSerializer.INTEGER); addBasic(Long.class, "long", BasicSerializer.LONG); addBasic(Float.class, "float", BasicSerializer.FLOAT); addBasic(Double.class, "double", BasicSerializer.DOUBLE); addBasic(Character.class, "char", BasicSerializer.CHARACTER); addBasic(String.class, "string", BasicSerializer.STRING); addBasic(java.util.Date.class, "date", BasicSerializer.DATE); addBasic(boolean.class, "boolean", BasicSerializer.BOOLEAN); addBasic(byte.class, "byte", BasicSerializer.BYTE); addBasic(short.class, "short", BasicSerializer.SHORT); addBasic(int.class, "int", BasicSerializer.INTEGER); addBasic(long.class, "long", BasicSerializer.LONG); addBasic(float.class, "float", BasicSerializer.FLOAT); addBasic(double.class, "double", BasicSerializer.DOUBLE); addBasic(char.class, "char", BasicSerializer.CHARACTER); addBasic(boolean[].class, "[boolean", BasicSerializer.BOOLEAN_ARRAY); addBasic(byte[].class, "[byte", BasicSerializer.BYTE_ARRAY); addBasic(short[].class, "[short", BasicSerializer.SHORT_ARRAY); addBasic(int[].class, "[int", BasicSerializer.INTEGER_ARRAY); addBasic(long[].class, "[long", BasicSerializer.LONG_ARRAY); addBasic(float[].class, "[float", BasicSerializer.FLOAT_ARRAY); addBasic(double[].class, "[double", BasicSerializer.DOUBLE_ARRAY); addBasic(char[].class, "[char", BasicSerializer.CHARACTER_ARRAY); addBasic(String[].class, "[string", BasicSerializer.STRING_ARRAY); addBasic(Object[].class, "[object", BasicSerializer.OBJECT_ARRAY); serializerMap.put(Class.class, new ClassSerializer()); deserializerMap.put(Class.class, new ClassDeserializer()); serializerMap.put(BigDecimal.class, new StringValueSerializer()); try { deserializerMap.put(BigDecimal.class, new StringValueDeserializer( BigDecimal.class)); } catch (Throwable e) { e.printStackTrace(); } // Patched here serializerMap.put(java.sql.Date.class, new FixedSqlDateSerializer()); serializerMap.put(java.sql.Time.class, new FixedSqlDateSerializer()); serializerMap.put(java.sql.Timestamp.class, new FixedSqlDateSerializer()); try { deserializerMap.put(java.sql.Date.class, new SqlDateDeserializer( java.sql.Date.class)); deserializerMap.put(java.sql.Time.class, new SqlDateDeserializer( java.sql.Time.class)); deserializerMap.put(java.sql.Timestamp.class, new SqlDateDeserializer(java.sql.Timestamp.class)); } catch (Throwable e) { e.printStackTrace(); } try { Class stackTrace = Class.forName("java.lang.StackTraceElement"); deserializerMap .put(stackTrace, new StackTraceElementDeserializer()); } catch (Throwable e) { } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -