summaryrefslogtreecommitdiff
path: root/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java
diff options
context:
space:
mode:
Diffstat (limited to 'lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java')
-rw-r--r--lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java49
1 files changed, 32 insertions, 17 deletions
diff --git a/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java b/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java
index 8a1b52d..8ed4590 100644
--- a/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java
+++ b/lang/src/main/java/net/openhft/lang/io/serialization/impl/GenericEnumMarshaller.java
@@ -1,25 +1,25 @@
/*
- * Copyright 2013 Peter Lawrey
+ * Copyright (C) 2015 higherfrequencytrading.com
*
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License.
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
*
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.openhft.lang.io.serialization.impl;
import net.openhft.lang.io.Bytes;
import net.openhft.lang.io.serialization.BytesMarshaller;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
+import net.openhft.lang.model.constraints.NotNull;
+import net.openhft.lang.model.constraints.Nullable;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
@@ -30,17 +30,20 @@ import java.util.Map;
* @author peter.lawrey
*/
public class GenericEnumMarshaller<E> implements BytesMarshaller<E> {
- @NotNull
- private final Class<E> classMarshaled;
+ private final int capacity;
@Nullable
- private final Constructor<E> constructor;
+ private transient final Constructor<E> constructor;
@Nullable
- private final Method valueOf;
+ private transient final Method valueOf;
@NotNull
private final Map<String, E> map;
+ //used by the read resolve method
+ private final Class<E> classMarshaled;
+
public GenericEnumMarshaller(@NotNull Class<E> classMarshaled, final int capacity) {
this.classMarshaled = classMarshaled;
+ this.capacity = capacity;
Constructor<E> constructor = null;
Method valueOf = null;
try {
@@ -48,6 +51,7 @@ public class GenericEnumMarshaller<E> implements BytesMarshaller<E> {
} catch (NoSuchMethodException e) {
try {
constructor = classMarshaled.getConstructor(String.class);
+ constructor.setAccessible(true);
} catch (NoSuchMethodException e1) {
throw new IllegalArgumentException(classMarshaled + " doesn't have a valueOf(String) or a Constructor(String)");
}
@@ -62,6 +66,10 @@ public class GenericEnumMarshaller<E> implements BytesMarshaller<E> {
};
}
+ private Object readResolve() {
+ return new GenericEnumMarshaller(classMarshaled, capacity);
+ }
+
@Override
public void write(@NotNull Bytes bytes, @Nullable E e) {
bytes.writeUTFΔ(e == null ? null : e.toString());
@@ -74,19 +82,26 @@ public class GenericEnumMarshaller<E> implements BytesMarshaller<E> {
return s == null ? null : valueOf(s);
}
+ @Nullable
+ @Override
+ public E read(Bytes bytes, @Nullable E e) {
+ return read(bytes);
+ }
+
private E valueOf(String s) {
E e = map.get(s);
if (e == null)
try {
if (constructor != null) {
map.put(s, e = constructor.newInstance(s));
+
} else {
@SuppressWarnings("unchecked")
E invoke = (E) valueOf.invoke(null, s);
map.put(s, e = invoke);
}
} catch (Exception t) {
- throw new AssertionError(t.getCause());
+ throw new AssertionError(t);
}
return e;
}