1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.jme3.network.serializing.serializers; 34 35 import com.jme3.network.serializing.Serializer; 36 import com.jme3.network.serializing.SerializerRegistration; 37 import java.io.IOException; 38 import java.nio.ByteBuffer; 39 import java.util.ArrayList; 40 import java.util.Collection; 41 import java.util.Iterator; 42 import java.util.logging.Level; 43 44 /** 45 * Serializes collections. 46 * 47 * @author Lars Wesselius 48 */ 49 public class CollectionSerializer extends Serializer { 50 51 @SuppressWarnings("unchecked") readObject(ByteBuffer data, Class<T> c)52 public <T> T readObject(ByteBuffer data, Class<T> c) throws IOException { 53 int length = data.getInt(); 54 55 Collection collection; 56 try { 57 collection = (Collection)c.newInstance(); 58 } catch (Exception e) { 59 log.log(Level.FINE, "[Serializer][???] Could not determine collection type. Using ArrayList."); 60 collection = new ArrayList(length); 61 } 62 63 if (length == 0) return (T)collection; 64 65 if (data.get() == (byte)1) { 66 SerializerRegistration reg = Serializer.readClass(data); 67 Class clazz = reg.getType(); 68 Serializer serializer = reg.getSerializer(); 69 70 for (int i = 0; i != length; ++i) { 71 collection.add(serializer.readObject(data, clazz)); 72 } 73 } else { 74 for (int i = 0; i != length; ++i) { 75 collection.add(Serializer.readClassAndObject(data)); 76 } 77 } 78 return (T)collection; 79 } 80 writeObject(ByteBuffer buffer, Object object)81 public void writeObject(ByteBuffer buffer, Object object) throws IOException { 82 Collection collection = (Collection)object; 83 int length = collection.size(); 84 85 buffer.putInt(length); 86 if (length == 0) return; 87 88 Iterator it = collection.iterator(); 89 Class elementClass = it.next().getClass(); 90 while (it.hasNext()) { 91 Object obj = it.next(); 92 93 if (obj.getClass() != elementClass) { 94 elementClass = null; 95 break; 96 } 97 } 98 99 if (elementClass != null) { 100 buffer.put((byte)1); 101 Serializer.writeClass(buffer, elementClass); 102 Serializer serializer = Serializer.getSerializer(elementClass); 103 104 for (Object elem : collection) { 105 serializer.writeObject(buffer, elem); 106 } 107 } else { 108 buffer.put((byte)0); 109 for (Object elem : collection) { 110 Serializer.writeClassAndObject(buffer, elem); 111 } 112 } 113 } 114 } 115