» »

[Android] Nov tip shranjevanja slike

[Android] Nov tip shranjevanja slike

piki12 ::

Pozdravljeni,
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?

FrEaKmAn ::

Kaj? Bolj razloži kaj želiš?

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.

piki12 ::

Problem je ker imam eksotične tipe in seveda se stvar zaplete:
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.

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
 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?
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() ?

piki12 ::

Hvala Mavrik tvoj komentar je bil najbolj uporaben izmed vseh :D thank you very much :P

urosz ::

piki12 je izjavil:

Če shranim Paint.tostring() ali bo to vredu ?
ali pa pa Path.tostring() ?


čist odvisno od tega, kaj ti toString() vrača. če vrne dovolj podatkov za popolno rekonstrukcijo, bi šlo tudi tako ;)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] Bluetooth aplikacija

Oddelek: Programiranje
5999 (862) marjan_h
»

Java skeniranje map in podmap

Oddelek: Programiranje
61057 (946) nightrage
»

[Android] Splošno

Oddelek: Programiranje
351931 (1061) piki12
»

android črta

Oddelek: Programiranje
412261 (1532) g333kk
»

Jasper subreport

Oddelek: Programiranje
131515 (1264) nightrage

Več podobnih tem