diff --git a/src/com/esotericsoftware/kryo/Kryo.java b/src/com/esotericsoftware/kryo/Kryo.java index 1a6ad805e..670791efb 100644 --- a/src/com/esotericsoftware/kryo/Kryo.java +++ b/src/com/esotericsoftware/kryo/Kryo.java @@ -1048,8 +1048,10 @@ public void setCopyReferences (boolean copyReferences) { } /** - * If true, when {@link #copy(Object)} is called all transient fields that are accessible will be ignored from - * being copied. Default is true. + * If false, when {@link #copy(Object)} is called all transient fields that are accessible will be ignored from + * being copied. This has to be set before registering classes with kryo for it to be used by all field + * serializers. If transient fields has to be copied for specific classes then use {@link FieldSerializer#setCopyTransient(boolean)}. + * Default is true. */ public void setCopyTransient(boolean copyTransient) { this.copyTransient = copyTransient; diff --git a/src/com/esotericsoftware/kryo/serializers/FieldSerializer.java b/src/com/esotericsoftware/kryo/serializers/FieldSerializer.java index 39db80133..0db350ac4 100644 --- a/src/com/esotericsoftware/kryo/serializers/FieldSerializer.java +++ b/src/com/esotericsoftware/kryo/serializers/FieldSerializer.java @@ -173,6 +173,7 @@ public FieldSerializer (Kryo kryo, Class type, Class[] generics) { this.genericsUtil = new FieldSerializerGenericsUtil(this); this.unsafeUtil = FieldSerializerUnsafeUtil.Factory.getInstance(this); this.annotationsUtil = new FieldSerializerAnnotationsUtil(this); + this.copyTransient = kryo.getCopyTransient(); rebuildCachedFields(); } diff --git a/test/com/esotericsoftware/kryo/FieldSerializerTest.java b/test/com/esotericsoftware/kryo/FieldSerializerTest.java index 9fb5a3d68..b8e49c575 100644 --- a/test/com/esotericsoftware/kryo/FieldSerializerTest.java +++ b/test/com/esotericsoftware/kryo/FieldSerializerTest.java @@ -15,8 +15,8 @@ * 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. */ - + * 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; import java.util.ArrayList; @@ -26,22 +26,19 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import org.objenesis.strategy.StdInstantiatorStrategy; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; +import com.esotericsoftware.kryo.serializers.CollectionSerializer; import com.esotericsoftware.kryo.serializers.CollectionSerializer.BindCollection; import com.esotericsoftware.kryo.serializers.DefaultArraySerializers.IntArraySerializer; import com.esotericsoftware.kryo.serializers.DefaultArraySerializers.LongArraySerializer; -import com.esotericsoftware.kryo.serializers.DefaultArraySerializers.ObjectArraySerializer; import com.esotericsoftware.kryo.serializers.DefaultSerializers.StringSerializer; import com.esotericsoftware.kryo.serializers.FieldSerializer; import com.esotericsoftware.kryo.serializers.FieldSerializer.Bind; import com.esotericsoftware.kryo.serializers.FieldSerializer.Optional; -import com.esotericsoftware.kryo.serializers.MapSerializer; -import com.esotericsoftware.kryo.serializers.CollectionSerializer; import com.esotericsoftware.kryo.serializers.MapSerializer.BindMap; /** @author Nathan Sweet */ @@ -462,7 +459,26 @@ public void testTransients () { HasTransients objectWithTransients2 = kryo.copy(objectWithTransients1); assertEquals("Objects should be equal if copy includes transient fields", objectWithTransients2, objectWithTransients1); } - + + public void testTransientsUsingGlobalConfig () { + kryo.setCopyTransient(false); + kryo.register(HasTransients.class); + HasTransients objectWithTransients1 = new HasTransients(); + objectWithTransients1.transientField1 = "Test"; + objectWithTransients1.anotherField2 = 5; + objectWithTransients1.anotherField3 = "Field2"; + + FieldSerializer ser = (FieldSerializer)kryo.getSerializer(HasTransients.class); + HasTransients objectWithTransients3 = kryo.copy(objectWithTransients1); + assertTrue("Objects should be different if copy does not include transient fields", + !objectWithTransients3.equals(objectWithTransients1)); + assertEquals("transient fields should be null", objectWithTransients3.transientField1, null); + + ser.setCopyTransient(true); + HasTransients objectWithTransients2 = kryo.copy(objectWithTransients1); + assertEquals("Objects should be equal if copy includes transient fields", objectWithTransients2, objectWithTransients1); + } + public void testCorrectlyAnnotatedFields () { kryo.register(int[].class); kryo.register(long[].class); @@ -1043,4 +1059,4 @@ public boolean equals(Object o) { return true; } } -} +}