Forum » Programiranje » [Android] Nov tip shranjevanja slike
[Android] Nov tip shranjevanja slike
piki12 ::
Pozdravljeni,
zanima me kako bi lahko shranil
Za kak nasvet lepo prosim?
zanima me kako bi lahko shranil
arraylist<mojihobjekotv>, rad bi naredil podatkovni tip, ki bi mi shranil, ta class, obenem pa bi lahko odprl z svojim programom, kako bi to naredil?
Za kak nasvet lepo prosim?
GupeM ::
Ta tvoj objekt mora implementirati interface Serializable. Če ta objekt vsebuje objekte drugih tipov, morajo tudi ti implementirati serializable, razen če vsebovan objekt ni potrebno da je shranjen. V tem primeru ga pri deklaraciji označiš kot transient.
Poglej si tole.
Poglej si tole.
piki12 ::
Problem je ker imam eksotične tipe in seveda se stvar zaplete:
Poskušal sem na 3 načine:
1. način je da sem v datoteko hotel shraniti vendar paint in path nista serializable, tudi ko sem obema clasoma dodal implements Serializable ne dela.
2. način sem se matral z bundlejom pa ne sprejme tega arraylista , ker ni sestavljen z navadnih tipov
3. z bazo ki pa tudi ne sprejme mojih eksotičnih tipov :(
public class AuditContainer implements Serializable { private Paint mPaint; private Path mPath; private int x,y; private String text; boolean is_text;
Poskušal sem na 3 načine:
1. način je da sem v datoteko hotel shraniti vendar paint in path nista serializable, tudi ko sem obema clasoma dodal implements Serializable ne dela.
2. način sem se matral z bundlejom pa ne sprejme tega arraylista , ker ni sestavljen z navadnih tipov
3. z bazo ki pa tudi ne sprejme mojih eksotičnih tipov :(
ragezor ::
Ko ti implementaš Serializable še ne narediš nič. Potem moraš še povedati kako se tvoj objekt serializia.
Primitivne tipe ala integer (in tudi String), pa navadne arraye je precej lahko serializirat, saj za integerje in stringe preprosto zapišeš številko ali string. Pri arrayu zapišeš recimo [1,2,3].
Point serializiranja je to, da imaš ti en objekt in ga zapišeš v datoteko/bazo/stream na tak način, da ko ga prebereš nazaj, lahko iz prebranega skonstruiraš enak objekt, kot si ga imel na začetku.
Pri javi se s toString metodo določa kako se objekt predstavi s stringom. Torej moraš v class implementirati toString. Vendar s tem ne boš mogel vedno predstaviti bolj kompleksnih objektov. Pri bolj kompleksnih zadevah ti bo moral povedati kdo drug več, ker se s tem nisme nikoli preveč ukvarjal, še posebej ne v javi.
Primitivne tipe ala integer (in tudi String), pa navadne arraye je precej lahko serializirat, saj za integerje in stringe preprosto zapišeš številko ali string. Pri arrayu zapišeš recimo [1,2,3].
Point serializiranja je to, da imaš ti en objekt in ga zapišeš v datoteko/bazo/stream na tak način, da ko ga prebereš nazaj, lahko iz prebranega skonstruiraš enak objekt, kot si ga imel na začetku.
Pri javi se s toString metodo določa kako se objekt predstavi s stringom. Torej moraš v class implementirati toString. Vendar s tem ne boš mogel vedno predstaviti bolj kompleksnih objektov. Pri bolj kompleksnih zadevah ti bo moral povedati kdo drug več, ker se s tem nisme nikoli preveč ukvarjal, še posebej ne v javi.
piki12 ::
obstaja kaka metoda ki bi mi ptrebne stvari nametala v to string, oz funkcija ki bi stvar pretopila v en string oz karkoli bolj uprabnega ker trenutno sem se 100% ustavil
GupeM ::
Tukaj imaš primer kako serializirati Paint object iz Android APIja. Podobno moraš potem narediti še z Path objectom. Tista dva integerja, String in boolean ki si jih definiral sam, pa je enostavno shraniti.
piki12 ::
Kako pa sedaj tukaj spremenim, ali pa kje ker sedaj sem dodla ti dva class kot je potrebno..
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); ArrayList<AuditContainer> a1=new ArrayList<AuditContainer>(); a1=mPanel.getGRAPHICOBJECTS(); String mBaseFolderPath = ""; String mFilePath = ""; if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { try { mBaseFolderPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/PaintFourFun/"; File fi = new File(mBaseFolderPath); if (!fi.exists()) fi.mkdir(); mFilePath = mBaseFolderPath ; File f = new File(mFilePath); FileOutputStream outStream = new FileOutputStream(f.getAbsolutePath() + "/RegionList.txt"); ObjectOutputStream objectOutStream = null; try { objectOutStream = new ObjectOutputStream(outStream); objectOutStream.writeInt(a1.size()); // Save size first for(AuditContainer r:a1) objectOutStream.writeObject(r); objectOutStream.close(); } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } } catch (FileNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } }} @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { ObjectInputStream objectInStream = null; try { FileInputStream inStream = new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/PaintFourFun/"+"/RegionList.txt"); objectInStream = new ObjectInputStream(inStream); int count = objectInStream.readInt(); // Get the number of regions ArrayList<AuditContainer> a=new ArrayList<AuditContainer>(); for (int c=0; c < count; c++) a.add((AuditContainer) objectInStream.readObject()); if(a.size()!=0) { mPanel.setGRAPHICOBJECTS(a); mPanel.onDrawAll(a); mPanel.panel(mPanel); } objectInStream.close(); } catch (IOException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } catch (ClassNotFoundException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } }
piki12 ::
Mah še kar se mi ni posvetil kako bi naredil, sedaj imam situacija ti dva clasa za serilazacijo v string (path in paint) in array list seznam normalnih objektov..
piki12 ::
Za primer ne vem kako bi ta class path serilizerov: javlja mi napako
Potem me pa zanima katere tipe bi še moral shranit za path oz kaj še seterat :)..
Path.FillType s = jo.opt("filltype").toString();
Potem me pa zanima katere tipe bi še moral shranit za path oz kaj še seterat :)..
public class PathSerializer { public static JSONObject toJSONObject(final Path p) throws JSONException { JSONObject jo = new JSONObject(); jo.put("filltype", p.getFillType()); return jo; } private final static Pattern PATTERN_INTEGER = Pattern.compile("^\\d+$"); public static boolean fromJSONObject( final Path p, final JSONObject jo){ Path.FillType s = jo.opt("filltype").toString(); if(s!=null) { try { p.setFillType(s); }catch (Exception ex){} } return true; } }
Zgodovina sprememb…
- spremenilo: piki12 ()
piki12 ::
Ali je še kakšen način v javi oz androidu da shranim celotni razred, v file, ali je še kak način..
Mavrik ::
Probleme imaš ker popolnoma narobe razmišljaš. Če boš uporabljal serializacijo, se boš krasno ustrelil v nogo (kar si, vidim, že pogruntal).
Namesto da se trudiš na vsak način zbasati cele objekte, ki niso prilagojeni za nobeno shranjevanje, moraš shraniti podatke, s katerih jih boš rekonstruiral.
Npr. za črto shraniš 4 koordinate, debelino in barvo, za path seznam komponent, etc. Za tak zapis pa uporabiš poljuben način (XML, JSON, plain-text, binaren, etc.).
Saj nekak si moral ustvariti te objekte ne? Zakaj si nisi tam zapisal potrebnih parametrov ali jih kar direktno dal v fajl?
Namesto da se trudiš na vsak način zbasati cele objekte, ki niso prilagojeni za nobeno shranjevanje, moraš shraniti podatke, s katerih jih boš rekonstruiral.
Npr. za črto shraniš 4 koordinate, debelino in barvo, za path seznam komponent, etc. Za tak zapis pa uporabiš poljuben način (XML, JSON, plain-text, binaren, etc.).
Saj nekak si moral ustvariti te objekte ne? Zakaj si nisi tam zapisal potrebnih parametrov ali jih kar direktno dal v fajl?
The truth is rarely pure and never simple.
piki12 ::
Res je že 7 dni se cel dan zafrkavam z tem, pa ne gre in ne gre, ....
Saj nekak si moral ustvariti te objekte ne? Ko nekaj narišem na canvas sem objekt ustvaril, vsakič nov
Zakaj si nisi tam zapisal potrebnih parametrov ali jih kar direktno dal v fajl? pametna ideja
Če shranim Paint.tostring() ali bo to vredu ?
ali pa pa Path.tostring() ?
Saj nekak si moral ustvariti te objekte ne? Ko nekaj narišem na canvas sem objekt ustvaril, vsakič nov
Zakaj si nisi tam zapisal potrebnih parametrov ali jih kar direktno dal v fajl? pametna ideja
Če shranim Paint.tostring() ali bo to vredu ?
ali pa pa Path.tostring() ?
urosz ::
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] Bluetooth aplikacijaOddelek: Programiranje | 1097 (960) | marjan_h |
» | Java skeniranje map in podmapOddelek: Programiranje | 1159 (1048) | nightrage |
» | [Android] SplošnoOddelek: Programiranje | 2011 (1141) | piki12 |
» | android črtaOddelek: Programiranje | 2411 (1682) | g333kk |
» | Jasper subreportOddelek: Programiranje | 1643 (1392) | nightrage |