Skip to content

Commit e62d6a0

Browse files
eamonnmcmanusGoogle Java Core Libraries
authored andcommitted
Add exception-throwing readObject to classes using the serial-proxy pattern.
See _Effective Java_, 3rd edition, Item 90. RELNOTES=Classes with "serial proxies" acquire exception-throwing `readObject` methods, in accordance with best practice. PiperOrigin-RevId: 451001736
1 parent 76260d9 commit e62d6a0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+312
-0
lines changed

android/guava/src/com/google/common/cache/LocalCache.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
import com.google.j2objc.annotations.RetainedWith;
5555
import com.google.j2objc.annotations.Weak;
5656
import java.io.IOException;
57+
import java.io.InvalidObjectException;
5758
import java.io.ObjectInputStream;
5859
import java.io.Serializable;
5960
import java.lang.ref.Reference;
@@ -4748,6 +4749,10 @@ public void cleanUp() {
47484749
Object writeReplace() {
47494750
return new ManualSerializationProxy<>(localCache);
47504751
}
4752+
4753+
private void readObject(ObjectInputStream in) throws InvalidObjectException {
4754+
throw new InvalidObjectException("Use ManualSerializationProxy");
4755+
}
47514756
}
47524757

47534758
static class LocalLoadingCache<K, V> extends LocalManualCache<K, V>
@@ -4797,5 +4802,9 @@ public final V apply(K key) {
47974802
Object writeReplace() {
47984803
return new LoadingSerializationProxy<>(localCache);
47994804
}
4805+
4806+
private void readObject(ObjectInputStream in) throws InvalidObjectException {
4807+
throw new InvalidObjectException("Use LoadingSerializationProxy");
4808+
}
48004809
}
48014810
}

android/guava/src/com/google/common/collect/EmptyContiguousSet.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
import com.google.common.annotations.GwtCompatible;
1717
import com.google.common.annotations.GwtIncompatible;
18+
import java.io.InvalidObjectException;
19+
import java.io.ObjectInputStream;
1820
import java.io.Serializable;
1921
import java.util.NoSuchElementException;
2022
import java.util.Set;
@@ -162,6 +164,11 @@ Object writeReplace() {
162164
return new SerializedForm<>(domain);
163165
}
164166

167+
@GwtIncompatible // serialization
168+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
169+
throw new InvalidObjectException("Use SerializedForm");
170+
}
171+
165172
@GwtIncompatible // NavigableSet
166173
@Override
167174
ImmutableSortedSet<C> createDescendingSet() {

android/guava/src/com/google/common/collect/ImmutableBiMap.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.google.common.annotations.GwtCompatible;
2424
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2525
import com.google.errorprone.annotations.DoNotCall;
26+
import java.io.InvalidObjectException;
27+
import java.io.ObjectInputStream;
2628
import java.util.Arrays;
2729
import java.util.Collection;
2830
import java.util.Comparator;
@@ -586,4 +588,8 @@ Builder<K, V> makeBuilder(int size) {
586588
Object writeReplace() {
587589
return new SerializedForm<>(this);
588590
}
591+
592+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
593+
throw new InvalidObjectException("Use SerializedForm");
594+
}
589595
}

android/guava/src/com/google/common/collect/ImmutableCollection.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import com.google.errorprone.annotations.CanIgnoreReturnValue;
2525
import com.google.errorprone.annotations.DoNotCall;
2626
import com.google.errorprone.annotations.DoNotMock;
27+
import java.io.InvalidObjectException;
28+
import java.io.ObjectInputStream;
2729
import java.io.Serializable;
2830
import java.util.AbstractCollection;
2931
import java.util.Arrays;
@@ -361,6 +363,10 @@ Object writeReplace() {
361363
return new ImmutableList.SerializedForm(toArray());
362364
}
363365

366+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
367+
throw new InvalidObjectException("Use SerializedForm");
368+
}
369+
364370
/**
365371
* Abstract base class for builders of {@link ImmutableCollection} types.
366372
*

android/guava/src/com/google/common/collect/ImmutableEnumMap.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
import com.google.common.annotations.GwtCompatible;
2222
import com.google.common.collect.ImmutableMap.IteratorBasedImmutableMap;
23+
import java.io.InvalidObjectException;
24+
import java.io.ObjectInputStream;
2325
import java.io.Serializable;
2426
import java.util.EnumMap;
2527
import javax.annotation.CheckForNull;
@@ -100,6 +102,10 @@ Object writeReplace() {
100102
return new EnumSerializedForm<>(delegate);
101103
}
102104

105+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
106+
throw new InvalidObjectException("Use EnumSerializedForm");
107+
}
108+
103109
/*
104110
* This class is used to serialize ImmutableEnumMap instances.
105111
*/

android/guava/src/com/google/common/collect/ImmutableEnumSet.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import com.google.common.annotations.GwtCompatible;
2020
import com.google.errorprone.annotations.concurrent.LazyInit;
21+
import java.io.InvalidObjectException;
22+
import java.io.ObjectInputStream;
2123
import java.io.Serializable;
2224
import java.util.Collection;
2325
import java.util.EnumSet;
@@ -126,6 +128,10 @@ Object writeReplace() {
126128
return new EnumSerializedForm<E>(delegate);
127129
}
128130

131+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
132+
throw new InvalidObjectException("Use SerializedForm");
133+
}
134+
129135
/*
130136
* This class is used to serialize ImmutableEnumSet instances.
131137
*/

android/guava/src/com/google/common/collect/ImmutableMap.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
import com.google.errorprone.annotations.concurrent.LazyInit;
3131
import com.google.j2objc.annotations.RetainedWith;
3232
import com.google.j2objc.annotations.WeakOuter;
33+
import java.io.InvalidObjectException;
34+
import java.io.ObjectInputStream;
3335
import java.io.Serializable;
3436
import java.util.AbstractMap;
3537
import java.util.Arrays;
@@ -1128,4 +1130,8 @@ Builder<K, V> makeBuilder(int size) {
11281130
Object writeReplace() {
11291131
return new SerializedForm<>(this);
11301132
}
1133+
1134+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
1135+
throw new InvalidObjectException("Use SerializedForm");
1136+
}
11311137
}

android/guava/src/com/google/common/collect/ImmutableMapEntrySet.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818

1919
import com.google.common.annotations.GwtCompatible;
2020
import com.google.common.annotations.GwtIncompatible;
21+
import java.io.InvalidObjectException;
22+
import java.io.ObjectInputStream;
2123
import java.io.Serializable;
2224
import java.util.Map.Entry;
2325
import javax.annotation.CheckForNull;
@@ -108,6 +110,11 @@ Object writeReplace() {
108110
return new EntrySetSerializedForm<>(map());
109111
}
110112

113+
@GwtIncompatible // serialization
114+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
115+
throw new InvalidObjectException("Use EntrySetSerializedForm");
116+
}
117+
111118
@GwtIncompatible // serialization
112119
private static class EntrySetSerializedForm<K, V> implements Serializable {
113120
final ImmutableMap<K, V> map;

android/guava/src/com/google/common/collect/ImmutableMultimap.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import com.google.errorprone.annotations.DoNotMock;
3030
import com.google.j2objc.annotations.Weak;
3131
import com.google.j2objc.annotations.WeakOuter;
32+
import java.io.InvalidObjectException;
33+
import java.io.ObjectInputStream;
3234
import java.io.Serializable;
3335
import java.util.ArrayList;
3436
import java.util.Arrays;
@@ -662,6 +664,11 @@ boolean isPartialView() {
662664
Object writeReplace() {
663665
return new KeysSerializedForm(ImmutableMultimap.this);
664666
}
667+
668+
@GwtIncompatible
669+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
670+
throw new InvalidObjectException("Use KeysSerializedForm");
671+
}
665672
}
666673

667674
@GwtIncompatible

android/guava/src/com/google/common/collect/ImmutableMultiset.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import com.google.errorprone.annotations.DoNotCall;
2626
import com.google.errorprone.annotations.concurrent.LazyInit;
2727
import com.google.j2objc.annotations.WeakOuter;
28+
import java.io.InvalidObjectException;
29+
import java.io.ObjectInputStream;
2830
import java.io.Serializable;
2931
import java.util.Arrays;
3032
import java.util.Collection;
@@ -365,6 +367,11 @@ Object writeReplace() {
365367
return new EntrySetSerializedForm<E>(ImmutableMultiset.this);
366368
}
367369

370+
@GwtIncompatible
371+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
372+
throw new InvalidObjectException("Use EntrySetSerializedForm");
373+
}
374+
368375
private static final long serialVersionUID = 0;
369376
}
370377

@@ -385,6 +392,11 @@ Object readResolve() {
385392
@Override
386393
abstract Object writeReplace();
387394

395+
@GwtIncompatible
396+
private void readObject(ObjectInputStream stream) throws InvalidObjectException {
397+
throw new InvalidObjectException("Use SerializedForm");
398+
}
399+
388400
/**
389401
* Returns a new builder. The generated builder is equivalent to the builder created by the {@link
390402
* Builder} constructor.

0 commit comments

Comments
 (0)