marshaller.java

来自「JGRoups源码」· Java 代码 · 共 143 行

JAVA
143
字号
// $Id: Marshaller.java,v 1.5 2004/10/04 20:43:35 belaban Exp $package org.jgroups.util;import org.jgroups.conf.ClassConfigurator;import org.jgroups.ChannelException;import java.io.Externalizable;import java.io.IOException;import java.io.ObjectInput;import java.io.ObjectOutput;/** * Title:        JGroups Communications * Description:  Contact me at <a href="mailto:mail@filip.net">mail@filip.net</a> * Copyright:    Copyright (c) 2002 * Company:      www.filip.net * @author Filip Hanik * @author Bela Ban * @version 1.0 * * This class marshalls classes, in other words it serializes and deserializes classes * to and from object streams. * It performs a magic number matching to decrease the number of bytes that are being sent * over the wire. * If no magic number is available for the class, the classname is sent over instead */public class Marshaller {    /**     * The class configurator maps classes to magic numbers     */    private static final ClassConfigurator mConfigurator;    static {        try {            mConfigurator=ClassConfigurator.getInstance(true);        }        catch(ChannelException e) {            throw new ExceptionInInitializerError(e.toString());        }    }    public Marshaller() {    }    /**     * reads the magic number, instantiates the class (from the     * configurator) and invokes the readExternal method on the object.     * If no magic number is present, the method will read the     * string and then get the class from the configurator.     * @param in an ObjectInput stream - the stream should be composed as follows:<BR>     *   [boolean -> int|string -> object data]     * <BR>     * If the boolean is true, then the next value is an int, the magic number.<BR>     * If the boolean is false, then the next value is a string (the class name)<BR>     * The object data is what the object instance uses to populate its fields<BR>     */    public static Externalizable read(ObjectInput in) throws IOException {        try {            boolean is_null=in.readBoolean();            if(is_null)                return null;            //see if we want to use a magic number            boolean usemagic=in.readBoolean();            //the class that we will use to instantiate the object with            Class extclass=null;            if(usemagic) {                //read the magic number                int magic=in.readInt();                //from the magic number, get the class                extclass=mConfigurator.get(magic);            }            else {                //we don't have a magic number, read the class name                String magic=in.readUTF();                //get the class, ie let the configurator load it                extclass=mConfigurator.get(magic);            }//end if            //instantiate the object            Externalizable newinstance=(Externalizable)extclass.newInstance();            //populate the object with its data            newinstance.readExternal(in);            //return the instance            return newinstance;        }        catch(Throwable x) {            if(x instanceof IOException)                throw (IOException)x;            else                throw new IOException(x.toString());        }    }    /**     * Writes an object to the ObjectOutput stream.     * If possible, we will send over a magic number instead of the class name     * so that we transfer less amount of data.     * @param inst - an object instance to be serialized, can not be null     * @param out - the ObjectOutput stream we will write the serialized data to     */    public static void write(Externalizable inst, ObjectOutput out) throws IOException {        boolean is_null=(inst == null);        try {            // if inst is a null value we write this first            out.writeBoolean(is_null);            if(is_null)                return;            //find out if we have a magic number for this class            int magic=mConfigurator.getMagicNumber(inst.getClass());            //-1 means no magic number otherwise we have one            if(magic != -1) {                //true means we use a magic number                out.writeBoolean(true);                //write the magic number                out.writeInt(magic);            }            else {                //we don't have a magic number                out.writeBoolean(false);                //write the classname instead                out.writeUTF(inst.getClass().getName());            }//end if            //write the object data            inst.writeExternal(out);        }        catch(Exception x) {            if(x instanceof IOException)                throw (IOException)x;            else                throw new java.io.IOException(x.toString());        }    }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?