Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* Copyright (c) 2008, Nathan Sweet
   * All rights reserved.
   * 
   * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
   * conditions are met:
   * 
   * - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
   * - 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.
  * - Neither the name of Esoteric Software nor the names of its contributors may be used to endorse or promote products derived
  * from this software without specific prior written permission.
  * 
  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS 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 THE COPYRIGHT HOLDER OR 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. */
 
 package com.esotericsoftware.kryo.util;
 
 import static com.esotericsoftware.kryo.util.Util.*;
 import static com.esotericsoftware.minlog.Log.*;
 
Resolves classes by ID or by fully qualified class name.

Author(s):
Nathan Sweet <misc@n4te.com>
 
 public class DefaultClassResolver implements ClassResolver {
 	static public final byte NAME = -1;
 
 	protected Kryo kryo;
 
 	protected final IntMap<RegistrationidToRegistration = new IntMap();
 	protected final ObjectMap<ClassRegistrationclassToRegistration = new ObjectMap();
 
 	protected IntMap<ClassnameIdToClass;
 	protected ObjectMap<StringClassnameToClass;
 	protected int nextNameId;
 
 	private int memoizedClassId = -1;
 	private Class memoizedClass;
 
 	public void setKryo (Kryo kryo) {
 		this. = kryo;
 	}
 
 	public Registration register (Registration registration) {
 		if (registration == nullthrow new IllegalArgumentException("registration cannot be null.");
 		if (registration.getId() != ) {
 			if () {
 				trace("kryo""Register class ID " + registration.getId() + ": " + className(registration.getType()) + " ("
 					+ registration.getSerializer().getClass().getName() + ")");
 			}
 			.put(registration.getId(), registration);
 		} else if () {
 			trace("kryo""Register class name: " + className(registration.getType()) + " ("
 				+ registration.getSerializer().getClass().getName() + ")");
 		}
 		.put(registration.getType(), registration);
 		if (registration.getType().isPrimitive()) .put(getWrapperClass(registration.getType()), registration);
 		return registration;
 	}
 
 	public Registration registerImplicit (Class type) {
 		return register(new Registration(type.getDefaultSerializer(type), ));
 	}
 
 	public Registration getRegistration (Class type) {
 		if (type == return ;
 		Registration registration = .get(type);
 		if (registration != null) {
 			 = type;
 			 = registration;
 		}
 		return registration;
 	}
 
 	public Registration getRegistration (int classID) {
 		return .get(classID);
 	}
 
 	public Registration writeClass (Output outputClass type) {
 		if (type == null) {
 			if ( || ( && .getDepth() == 1)) log("Write"null);
 			output.writeVarInt(.true);
 			return null;
 		}
 		Registration registration = .getRegistration(type);
 		if (registration.getId() == )
 			writeName(outputtyperegistration);
		else {
			if (trace("kryo""Write class " + registration.getId() + ": " + className(type));
			output.writeVarInt(registration.getId() + 2, true);
		}
		return registration;
	}
	protected void writeName (Output outputClass typeRegistration registration) {
		output.writeVarInt( + 2, true);
		if ( != null) {
			int nameId = .get(type, -1);
			if (nameId != -1) {
				if (trace("kryo""Write class name reference " + nameId + ": " + className(type));
				output.writeVarInt(nameIdtrue);
				return;
			}
		}
		// Only write the class name the first time encountered in object graph.
		if (trace("kryo""Write class name: " + className(type));
		int nameId = ++;
		.put(typenameId);
		output.writeVarInt(nameIdtrue);
		output.writeString(type.getName());
	}
	public Registration readClass (Input input) {
		int classID = input.readVarInt(true);
		switch (classID) {
		case .:
			if ( || ( && .getDepth() == 1)) log("Read"null);
			return null;
		case  + 2: // Offset for NAME and NULL.
			return readName(input);
		}
		if (classID == return ;
		Registration registration = .get(classID - 2);
		if (registration == nullthrow new KryoException("Encountered unregistered class ID: " + (classID - 2));
		if (trace("kryo""Read class " + (classID - 2) + ": " + className(registration.getType()));
		 = classID;
		 = registration;
		return registration;
	}
	protected Registration readName (Input input) {
		int nameId = input.readVarInt(true);
		if ( == null = new IntMap();
		Class type = .get(nameId);
		if (type == null) {
			// Only read the class name the first time encountered in object graph.
			String className = input.readString();
			type = getTypeByName(className);
			if (type == null) {
				try {
					type = Class.forName(classNamefalse.getClassLoader());
catch (ClassNotFoundException ex) {
					throw new KryoException("Unable to find class: " + classNameex);
				}
				if ( == null = new ObjectMap();
				.put(classNametype);
			}
			.put(nameIdtype);
			if (trace("kryo""Read class name: " + className);
else {
			if (trace("kryo""Read class name reference " + nameId + ": " + className(type));
		}
		return .getRegistration(type);
	}
	protected Class<?> getTypeByName(final String className) {
		return  != null ? .get(className) : null;
	}
	public void reset () {
			if ( != null.clear();
			if ( != null.clear();
		}
	}
New to GrepCode? Check out our FAQ X