Skip to content

Commit 5f18674

Browse files
committed
Convert ConcurrentHashMap to HashMap before seralizing to a file to avoid a NotSerializableException
1 parent 077c7a0 commit 5f18674

2 files changed

Lines changed: 14 additions & 5 deletions

File tree

‎src/main/java/org/altbeacon/beacon/service/MonitoringStatus.java‎

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.io.ObjectInputStream;
1616
import java.io.ObjectOutputStream;
1717
import java.util.ArrayList;
18+
import java.util.HashMap;
1819
import java.util.Iterator;
1920
import java.util.List;
2021
import java.util.Map;
@@ -141,8 +142,7 @@ private Map<Region, RegionMonitoringState> getRegionsStateMap() {
141142

142143
private void restoreOrInitializeMonitoringStatus() {
143144
long millisSinceLastMonitor = System.currentTimeMillis() - getLastMonitoringStatusUpdateTime();
144-
mRegionsStatesMap = new ConcurrentHashMap<Region, RegionMonitoringState>() {
145-
};
145+
mRegionsStatesMap = new ConcurrentHashMap<Region, RegionMonitoringState>();
146146
if (!mStatePreservationIsOn) {
147147
LogManager.d(TAG, "Not restoring monitoring state because persistence is disabled");
148148
}
@@ -180,10 +180,17 @@ protected void saveMonitoringStatusIfOn() {
180180
try {
181181
outputStream = mContext.openFileOutput(STATUS_PRESERVATION_FILE_NAME, MODE_PRIVATE);
182182
objectOutputStream = new ObjectOutputStream(outputStream);
183-
objectOutputStream.writeObject(getRegionsStateMap());
184-
183+
Map<Region,RegionMonitoringState> map = getRegionsStateMap();
184+
// Must convert ConcurrentHashMap to HashMap becasue attempting to serialize
185+
// ConcurrentHashMap throws a java.io.NotSerializableException
186+
HashMap<Region,RegionMonitoringState> serializableMap = new HashMap<Region,RegionMonitoringState>();
187+
for (Region region : map.keySet()) {
188+
serializableMap.put(region, map.get(region));
189+
}
190+
objectOutputStream.writeObject(serializableMap);
185191
} catch (IOException e) {
186-
LogManager.e(TAG, "Error while saving monitored region states to file. %s ", e.getMessage());
192+
LogManager.e(TAG, "Error while saving monitored region states to file ", e);
193+
e.printStackTrace(System.err);
187194
} finally {
188195
if (null != outputStream) {
189196
try {

‎src/test/java/org/altbeacon/beacon/service/MonitoringStatusTest.java‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import android.content.Context;
55
import android.os.AsyncTask;
66
import android.os.Build;
7+
import android.util.Log;
78

89
import org.altbeacon.beacon.BeaconManager;
910
import org.altbeacon.beacon.Region;
@@ -30,6 +31,7 @@
3031
@RunWith(RobolectricTestRunner.class)
3132
@Config(sdk = 18)
3233
public class MonitoringStatusTest {
34+
private static final String TAG = MonitoringStatusTest.class.getSimpleName();
3335
@Before
3436
public void before() {
3537
org.robolectric.shadows.ShadowLog.stream = System.err;

0 commit comments

Comments
 (0)