Serializacja, Koncepcja...

0

Cześć Wam :)
Piszę właśnie program, w którym chcę uzyskać pewną pluginowość.
Mam abstrakcyjną klasę Pies, która posiada kilka składowych pól oraz metod. Chciałbym, abym mógł importować do swojego programu obiekty typu Pies - serializacja. Każdy taki obiekt ma posiadać swój edytor(GUI), który wprowadza zmiany w zmiennej properties.
Nie mogę stworzyć klasy, która będzie dziedziczyć po Pies, z tego względu, że wtedy musiałbym mieć tą konkretną klasę w programie, więc jedynym wyjściem jest stworzenie klasy anonimowej.

Klasa Pies:

public abstract class Pies implements Serializable {
    public Pies(HashMap m) {
        
        this.properties = new HashMap<>(m);
    }
    
    public abstract boolean edit();
    public abstract String getName();
    
    protected Map getProperties() {
        
        return this.properties;
    }
    
    private Map properties;
}

Czy jedynym wyjściem jest tworzenie edytora, przy każdym wywołaniu metody?

public static void main(String[] args) {
        
        try {
            final Pies pies = new Pies(new HashMap<>()) {
            
                public boolean edit() {

                    // final class Edytor extends JDialog....
                    return false;
                }
                public String getName() {

                    return "";
                }
            };
            
            // --------- zapisywanie
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("jakis_pies")));
            oos.writeObject(pies);
            oos.close();
        }
        catch(Exception e) {e.printStackTrace();}
    }

Można to zrobić inaczej?
Będę wdzięczny za cokolwiek.

Żebyśmy się dobrze zrozumieli - tworzę sobie jakiś model psa wraz z edytorem i wysyłam drugiej osobie, która to importuje go do programu... :)

0

nwm jeżeli nie są to jakieś dtosy ,bo to maly projekt a obiekty takie bardziej w środku to nwm może wysyłaj to jakoś inaczej żeby pozbyć się tej serializacji , która nie pozwala np. na korztystanie z interfejsów . nie wiem rest albo coś

0

Niestety nie rozumiem
Mimo wszystko dzięki :D

0

Stwórz bezstanowy edytor który może "załadować" dowolny obiekt do edycji.

0

Mam abstrakcyjną klasę Pies, która posiada kilka składowych pól oraz metod. Chciałbym, abym mógł importować do swojego programu obiekty typu Pies - serializacja. Każdy taki obiekt ma posiadać swój edytor(GUI), który wprowadza zmiany w zmiennej properties.
Nie mogę stworzyć klasy, która będzie dziedziczyć po Pies, z tego względu, że wtedy musiałbym mieć tą konkretną klasę w programie, więc jedynym wyjściem jest stworzenie klasy anonimowej.

Programuję od kilku lat, głównie w javie i nie mam pojęcia co ty tu właśnie napisałeś. Napisz po polsku co chcesz osiągnąć bez używania mądrze brzmiących słów i wyciągania własnych wniosków to może coś wymyślimy.

0

Dzięki Shalom.
Myślałem nad tym, jednak program byłby bardziej od programisty dla programisty, niż od programisty dla normalnego użytkownika - bardzo niezrozumiały, chaotyczny interfejs edytora.
Z dwojga złego?
Może to w ogóle zły pomysł? Może pozbyć się tej opcji? Szukałem czegoś nowego....
Co myślicie o zamknięciu edytora w metodzie? Chyba to by było jedyne wyjście.

Kolego wyżej, napisałem na końcu. Może faktycznie nie umiem opowiadać :D

Jeżeli stworzyłbym konkretną klasę, która dziedziczy po Pies, przykładowo taką

class A extends Pies {....}

, to nie mógłbym potem jej wczytać jako obiektu, bo maszyna musi mieć definicje klasy A, a właśnie tak być nie może - mija się to z celem.

Jakbym mógł takie tricki robić, to bym nie musiał zamykać edytora w metodzie:)

0

@Zimny Samiec moim zdaniem pomysł w ogóle jest dziwny i zły. Czemu nie serializujesz tej klasy po ludzku do jsona czy xmla po prostu? Albo w ogóle nie eksportujesz z niej tylko propertisów i ich nie prezentujesz w edytorze? Skoro ktoś może nie mieć definicji tej klasy to przesłanie mu obiektu tej klasy jest dziwnym pomysłem bo nie ma żadnych plusów tego że to obiekt.

0

Faktycznie to NIE MA sensu. Dałem ciała z przykładem...
Zapomniałem dodać, że oprócz tego, że ten nasz piesek ma różne właściwości, to robi w pewnym stopniu także coś innego, zmienia się jego zachowanie - muszę przekazać kawałek kodu.

Teraz to ma sens, prawda? :)

0

Niewiele bo nadal musisz jakoś przekazać do tej drugiej aplikacji definicje tej klasy, inaczej nic z tego nie będzie ;] Od biedy można to zrobić, przesłać plik class i załadować w runtime refleksją, ale to są cuda na kiju generalnie i trudno mi sobie wyobrazić realne zastosowanie dla takich operacji.

0

Definicja klasy Pies oczywiście zostaje...

0
public abstract class Pies implements Serializable {
    public Pies(HashMap m) {
        
        this.properties = new HashMap<>(m);
    }
    
    public abstract void wyszczekaj(ObiektDoWyszczekania odw);
    public abstract boolean edit();
    public abstract String getName();
    
    protected Map getProperties() {
        
        return this.properties;
    }
    
    private Map properties;
}
public interface ObiektDoWyszczekania {
    
    public abstract void wyszczekaj();
    public abstract void wysczekajMu(String s);
    public abstract String odszczekaj();
}
public static void main(String[] args) {
        
        try {
            final Pies pies = new Pies(new HashMap<>()) {
            
                public boolean edit() {

                    // final class Edytor extends JDialog....
                    return false;
                }
                public String getName() {

                    return "";
                }
                public void wyszczekaj(ObiektDoWyszczekania odw) {
                    
                    odw.wysczekajMu(".");
                }
            };
                        
            // --------- zapisywanie
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File("jakis_pies")));
            oos.writeObject(pies);
            oos.close();
            
            // --------- odczyt
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream(new File("jakis_pies")));
            Pies p = (Pies) ois.readObject();
            ois.close();
            p.wyszczekaj(new ObiektDoWyszczekania() {

                public void wyszczekaj() {
                }
                public void wysczekajMu(String s) {
                    System.out.println(s);
                }
                public String odszczekaj() {
                    
                    return "hehehe";
                }
            });
        }
        catch(Exception e) {e.printStackTrace();}
    }

To wszystko działa jak należy :) Tylko ten edytor zamknięty w metodzie...

1 użytkowników online, w tym zalogowanych: 0, gości: 1