From 3a7831ed8397c65852c9ed9eee33f1d592378943 Mon Sep 17 00:00:00 2001 From: Size43 Date: Thu, 21 May 2015 22:22:51 +0200 Subject: Added writeObject & readObject methods --- .../java/org/rssin/android/FiltersActivity.java | 11 ++-- .../main/java/org/rssin/android/FiltersList.java | 14 +++++ .../main/java/org/rssin/neurons/FeedSorter.java | 51 +++++++++++++--- .../java/org/rssin/neurons/MultiNeuralNetwork.java | 15 ++++- .../main/java/org/rssin/neurons/NeuralNetwork.java | 16 ++++- app/src/main/java/org/rssin/neurons/Neuron.java | 14 ++++- .../java/org/rssin/neurons/SerializationTools.java | 69 ++++++++++++++++++++++ 7 files changed, 172 insertions(+), 18 deletions(-) mode change 100644 => 100755 app/src/main/java/org/rssin/android/FiltersActivity.java mode change 100644 => 100755 app/src/main/java/org/rssin/android/FiltersList.java create mode 100755 app/src/main/java/org/rssin/neurons/SerializationTools.java (limited to 'app/src/main/java/org') diff --git a/app/src/main/java/org/rssin/android/FiltersActivity.java b/app/src/main/java/org/rssin/android/FiltersActivity.java old mode 100644 new mode 100755 index b5f8760..63c667d --- a/app/src/main/java/org/rssin/android/FiltersActivity.java +++ b/app/src/main/java/org/rssin/android/FiltersActivity.java @@ -28,6 +28,7 @@ import org.rssin.rssin.Keyword; import org.rssin.rssin.R; import java.io.IOException; +import java.io.InvalidClassException; import java.net.MalformedURLException; import java.util.List; @@ -67,11 +68,11 @@ public class FiltersActivity extends ActionBarActivity { final FilterAdapter adapter = new FilterAdapter(this, R.layout.item_filter, filtersList.getFilters()); filtersView.setAdapter(adapter); - try { - filtersList.save(); - } catch (IOException ex) { - Toast.makeText(this, getResources().getString(R.string.error_save_filters), Toast.LENGTH_SHORT).show(); - } +// try { +// filtersList.save(); +// } catch (IOException ex) { +// Toast.makeText(this, getResources().getString(R.string.error_save_filters), Toast.LENGTH_SHORT).show(); +// } setupListeners(); } diff --git a/app/src/main/java/org/rssin/android/FiltersList.java b/app/src/main/java/org/rssin/android/FiltersList.java old mode 100644 new mode 100755 index 608fbc7..129cc27 --- a/app/src/main/java/org/rssin/android/FiltersList.java +++ b/app/src/main/java/org/rssin/android/FiltersList.java @@ -1,8 +1,11 @@ package org.rssin.android; import android.content.Context; +import android.os.Debug; import android.preference.PreferenceManager; import android.util.Base64; +import android.util.Log; +import android.util.TimingLogger; import org.rssin.rssin.Filter; @@ -68,12 +71,23 @@ public class FiltersList { * @throws IOException if serializing failed */ public synchronized void save() throws IOException { + long startTime = System.currentTimeMillis(); + Log.d("FiltersList", "Start saving..."); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(filters); oos.close(); + + Log.d("FiltersList", "Serializing took " + ( System.currentTimeMillis() - startTime) + "ms"); + String string = Base64.encodeToString(baos.toByteArray(), Base64.DEFAULT); + + Log.d("FiltersList", "Converting to base64 took " + ( System.currentTimeMillis() - startTime) + "ms"); + PreferenceManager.getDefaultSharedPreferences(context).edit().putString(PREF_KEY, string).commit(); + + Log.d("FiltersList", "Saving took " + ( System.currentTimeMillis() - startTime) + "ms"); } public Filter getFilterFromHashCode(int hashcode) { diff --git a/app/src/main/java/org/rssin/neurons/FeedSorter.java b/app/src/main/java/org/rssin/neurons/FeedSorter.java index 8549fcf..d567e63 100755 --- a/app/src/main/java/org/rssin/neurons/FeedSorter.java +++ b/app/src/main/java/org/rssin/neurons/FeedSorter.java @@ -1,7 +1,10 @@ package org.rssin.neurons; +import android.util.Log; + import org.rssin.rss.FeedItem; +import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; @@ -19,15 +22,45 @@ public class FeedSorter implements Serializable { private static final long serialVersionUID = 0; private final SentenceSplitter splitter = new SentenceSplitter(); - private final MultiNeuralNetwork nn = new MultiNeuralNetwork(25, 50); - private final List trainingCases = new ArrayList<>(); - - private final int[] isNthMonthInput = new int[12]; - private final int[] isNthWeekDayInput = new int[7]; - private final int isMorning, isAfternoon, isEvening, isNight, biasInput; - private final Hashtable categoryInputs = new Hashtable<>(); - private final Hashtable wordInputs = new Hashtable<>(); - private final Hashtable authorInputs = new Hashtable<>(); + private MultiNeuralNetwork nn = new MultiNeuralNetwork(25, 50); + private List trainingCases = new ArrayList<>(); + + private int[] isNthMonthInput = new int[12]; + private int[] isNthWeekDayInput = new int[7]; + private int isMorning, isAfternoon, isEvening, isNight, biasInput; + private Hashtable categoryInputs = new Hashtable<>(); + private Hashtable wordInputs = new Hashtable<>(); + private Hashtable authorInputs = new Hashtable<>(); + + private void writeObject(java.io.ObjectOutputStream stream) throws IOException { + stream.writeObject(nn); + stream.writeObject(trainingCases); + SerializationTools.writeArray(isNthMonthInput, stream); + SerializationTools.writeArray(isNthWeekDayInput, stream); + stream.writeInt(isMorning); + stream.writeInt(isAfternoon); + stream.writeInt(isEvening); + stream.writeInt(isNight); + stream.writeInt(biasInput); + stream.writeObject(categoryInputs); + stream.writeObject(wordInputs); + stream.writeObject(authorInputs); + } + + private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { + nn = (MultiNeuralNetwork) stream.readObject(); + trainingCases = (List) stream.readObject(); + isNthMonthInput = SerializationTools.readArrayInt(stream); + isNthWeekDayInput = SerializationTools.readArrayInt(stream); + isMorning = stream.readInt(); + isAfternoon = stream.readInt(); + isEvening = stream.readInt(); + isNight = stream.readInt(); + biasInput = stream.readInt(); + categoryInputs = (Hashtable) stream.readObject(); + wordInputs = (Hashtable) stream.readObject(); + authorInputs = (Hashtable) stream.readObject(); + } public FeedSorter() { biasInput = nn.addInput(); diff --git a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java index 03ad2d1..68ddddd 100755 --- a/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java +++ b/app/src/main/java/org/rssin/neurons/MultiNeuralNetwork.java @@ -1,6 +1,11 @@ package org.rssin.neurons; +import android.util.Log; + +import java.io.IOException; import java.io.Serializable; +import java.util.Hashtable; +import java.util.List; /** * @author Jos @@ -8,7 +13,15 @@ import java.io.Serializable; */ class MultiNeuralNetwork implements Serializable { private static final long serialVersionUID = 0; - private final NeuralNetwork[] networks; + private NeuralNetwork[] networks; + + private void writeObject(java.io.ObjectOutputStream stream) throws IOException { + SerializationTools.writeArray(networks, stream); + } + + private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { + networks = SerializationTools.readArray(stream, NeuralNetwork.class); + } public MultiNeuralNetwork(int numNetworks, int numHiddenNodes) { networks = new NeuralNetwork[numNetworks]; diff --git a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java index 0acfda7..0540652 100755 --- a/app/src/main/java/org/rssin/neurons/NeuralNetwork.java +++ b/app/src/main/java/org/rssin/neurons/NeuralNetwork.java @@ -1,7 +1,9 @@ package org.rssin.neurons; import android.annotation.SuppressLint; +import android.util.Log; +import java.io.IOException; import java.io.Serializable; /** @@ -9,8 +11,18 @@ import java.io.Serializable; */ class NeuralNetwork implements Serializable { private static final long serialVersionUID = 0; - private final Neuron[] hiddenNodes; - private final Neuron outputNode; + private Neuron[] hiddenNodes; + private Neuron outputNode; + + private void writeObject(java.io.ObjectOutputStream stream) throws IOException { + SerializationTools.writeArray(hiddenNodes, stream); + stream.writeObject(outputNode); + } + + private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { + hiddenNodes = SerializationTools.readArray(stream, Neuron.class); + outputNode = (Neuron) stream.readObject(); + } NeuralNetwork(int numHiddenNodes) { if (numHiddenNodes < 1) { diff --git a/app/src/main/java/org/rssin/neurons/Neuron.java b/app/src/main/java/org/rssin/neurons/Neuron.java index 23f69e1..ec4bf2c 100755 --- a/app/src/main/java/org/rssin/neurons/Neuron.java +++ b/app/src/main/java/org/rssin/neurons/Neuron.java @@ -1,5 +1,8 @@ package org.rssin.neurons; +import android.util.Log; + +import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -12,7 +15,16 @@ class Neuron implements Serializable { private static final long serialVersionUID = 0; private static final Random r = new Random(); - private final List weights = new ArrayList<>(); + private List weights = new ArrayList<>(); + + private void writeObject(java.io.ObjectOutputStream stream) throws IOException { + SerializationTools.writeList(weights, stream); + } + + private void readObject(java.io.ObjectInputStream stream) throws IOException, ClassNotFoundException { + weights = SerializationTools.readList(stream); + } + public Neuron() { } diff --git a/app/src/main/java/org/rssin/neurons/SerializationTools.java b/app/src/main/java/org/rssin/neurons/SerializationTools.java new file mode 100755 index 0000000..41e79f2 --- /dev/null +++ b/app/src/main/java/org/rssin/neurons/SerializationTools.java @@ -0,0 +1,69 @@ +package org.rssin.neurons; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Jos. + */ +public class SerializationTools { + public static void writeArray(int[] array, ObjectOutputStream stream) throws IOException { + stream.write(array.length); + for(int i : array) + { + stream.write(i); + } + } + + public static int[] readArrayInt(ObjectInputStream stream) throws IOException { + int[] array = new int[stream.readInt()]; + for(int i = 0; i < array.length; i++) + { + array[i] = stream.readInt(); + } + + return array; + } + + public static void writeArray(T[] array, ObjectOutputStream stream) throws IOException { + stream.write(array.length); + for(T i : array) + { + stream.writeObject(i); + } + } + + public static T[] readArray(ObjectInputStream stream, Class c) throws IOException, ClassNotFoundException { + T[] array = (T[]) Array.newInstance(c, stream.readInt()); + for(int i = 0; i < array.length; i++) + { + array[i] = (T) stream.readObject(); + } + + return array; + } + + public static void writeList(List list, ObjectOutputStream stream) throws IOException { + stream.write(list.size()); + for(T i : list) + { + stream.writeObject(i); + } + } + + public static List readList(ObjectInputStream stream) throws IOException, ClassNotFoundException { + List array = new ArrayList<>(); + int count = stream.readInt(); + + for(int i = 0; i < count; i++) + { + array.add((T) stream.readObject()); + } + + return array; + } +} -- cgit v1.2.3