Hur ska jag kunna använda JSON för att använda getters och setters osv?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008

Hur ska jag kunna använda JSON för att använda getters och setters osv?

Jag har länge gjort instruktionslistor igenom CSV filer och det är bara bökigt och svårt att få till det. Minsta lilla ändring, och allt måste göras om.

Men idag upptäckte jag JSON. Trodde det var ett programmeringsspråk först, men nu förstår jag att det handlar om att samla information i en enda fil. Snyggt och smidigt.

Jag använder Deeplearning4J och med detta så kan man generera JSON eller Yaml filer, men dom är enorma och riktigt grötiga. Jag skulle behöva en skräddarsydd lösning för att lagra denna kods konfigueringar i en JSON-fil som passar mig.

Problemet är att Deeplearning4J's JSON-generering skapar:

  • Standardvärden

  • Grötig JSON fil

  • Ändra denna manuellt så ligger man illa till. Det blir bara fel

Jag skulle vilja ha en lösning som kan köra denna kod nedan. Jag tänkte först om man skulle läsa en JSON fil som det vore en lång array och där efter så har jag brutalt många if-satser som väljer vilken getter och sätter jag ska använda mig av.

Men detta lät omodernt dåligt. Därför undrar jag hur jag skulle kunna göra igenom att sätta dessa värden på objecterna builder och listbuilder.

Builder är mer konstant och ändrar endast bara sina argument. Ibland kan det vara new Sgd(100) eller new AdaMax(34.3)
ListBuilder ändrar sig i längd beroende på hur många layers man vill ha.

Fråga:

Tror ni det skulle fungera att importera denna JSON fil nedan och sedan skapa arrayer av det hela, där man bara ändrar vissa element? Vi kan utgå från att denna JSON fil nedan är en mall på standardkonfiguering, där endast parametrar behöver ändras och lager behövs läggas till eller tas bort.

Hur skulle du ha gjort?

Exempel: Hur skulle ni sätta ett värde från en JSON fil till just denna rad builder.weightInit(WeightInit.XAVIER);?
Vilket är JSON kod för

"weightInitFn" : { "@class" : "org.deeplearning4j.nn.weights.WeightInitXavier" }

/* * Create a global configuration */ builder = new NeuralNetConfiguration.Builder(); builder.seed(100); builder.weightInit(WeightInit.XAVIER); builder.updater(new Sgd(3.2)); /* * Layer configuration */ listBuilder = new ListBuilder(builder); listBuilder.layer(new DenseLayer.Builder() .nIn(4) .nOut(3) .activation(Activation.TANH) .build()); listBuilder.layer(new LSTM.Builder() .nIn(3) .nOut(3) .activation(Activation.RELU) .build()); listBuilder.layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD) .activation(Activation.SOFTMAX) .nIn(3) .nOut(3) .build()); /* * Build the configuration */ multiLayerConfiguration = listBuilder.build(); /* * Create the model */ multiLayerNetwork = new MultiLayerNetwork(multiLayerConfiguration);

Denna kod ovan kan genereras till en JSON fil.

{ "backpropType" : "Standard", "cacheMode" : "NONE", "confs" : [ { "cacheMode" : "NONE", "dataType" : "FLOAT", "epochCount" : 0, "iterationCount" : 0, "layer" : { "@class" : "org.deeplearning4j.nn.conf.layers.DenseLayer", "activationFn" : { "@class" : "org.nd4j.linalg.activations.impl.ActivationTanH" }, "biasInit" : 0.0, "biasUpdater" : null, "constraints" : null, "gainInit" : 1.0, "gradientNormalization" : "None", "gradientNormalizationThreshold" : 1.0, "hasBias" : true, "hasLayerNorm" : false, "idropout" : null, "iupdater" : { "@class" : "org.nd4j.linalg.learning.config.Sgd", "learningRate" : 3.2 }, "layerName" : "layer0", "nin" : 4, "nout" : 3, "regularization" : [ ], "regularizationBias" : [ ], "weightInitFn" : { "@class" : "org.deeplearning4j.nn.weights.WeightInitXavier" }, "weightNoise" : null }, "maxNumLineSearchIterations" : 5, "miniBatch" : true, "minimize" : true, "optimizationAlgo" : "STOCHASTIC_GRADIENT_DESCENT", "seed" : 100, "stepFunction" : null, "variables" : [ "W", "b" ] }, { "cacheMode" : "NONE", "dataType" : "FLOAT", "epochCount" : 0, "iterationCount" : 0, "layer" : { "@class" : "org.deeplearning4j.nn.conf.layers.LSTM", "activationFn" : { "@class" : "org.nd4j.linalg.activations.impl.ActivationReLU" }, "biasInit" : 0.0, "biasUpdater" : null, "constraints" : null, "forgetGateBiasInit" : 1.0, "gainInit" : 1.0, "gateActivationFn" : { "@class" : "org.nd4j.linalg.activations.impl.ActivationSigmoid" }, "gradientNormalization" : "None", "gradientNormalizationThreshold" : 1.0, "idropout" : null, "iupdater" : { "@class" : "org.nd4j.linalg.learning.config.Sgd", "learningRate" : 3.2 }, "layerName" : "layer1", "nin" : 3, "nout" : 3, "regularization" : [ ], "regularizationBias" : [ ], "weightInitFn" : { "@class" : "org.deeplearning4j.nn.weights.WeightInitXavier" }, "weightInitFnRecurrent" : null, "weightNoise" : null }, "maxNumLineSearchIterations" : 5, "miniBatch" : true, "minimize" : true, "optimizationAlgo" : "STOCHASTIC_GRADIENT_DESCENT", "seed" : 100, "stepFunction" : null, "variables" : [ "W", "RW", "b" ] }, { "cacheMode" : "NONE", "dataType" : "FLOAT", "epochCount" : 0, "iterationCount" : 0, "layer" : { "@class" : "org.deeplearning4j.nn.conf.layers.OutputLayer", "activationFn" : { "@class" : "org.nd4j.linalg.activations.impl.ActivationSoftmax" }, "biasInit" : 0.0, "biasUpdater" : null, "constraints" : null, "gainInit" : 1.0, "gradientNormalization" : "None", "gradientNormalizationThreshold" : 1.0, "hasBias" : true, "idropout" : null, "iupdater" : { "@class" : "org.nd4j.linalg.learning.config.Sgd", "learningRate" : 3.2 }, "layerName" : "layer2", "lossFn" : { "@class" : "org.nd4j.linalg.lossfunctions.impl.LossNegativeLogLikelihood", "softmaxClipEps" : 1.0E-10 }, "nin" : 3, "nout" : 3, "regularization" : [ ], "regularizationBias" : [ ], "weightInitFn" : { "@class" : "org.deeplearning4j.nn.weights.WeightInitXavier" }, "weightNoise" : null }, "maxNumLineSearchIterations" : 5, "miniBatch" : true, "minimize" : true, "optimizationAlgo" : "STOCHASTIC_GRADIENT_DESCENT", "seed" : 100, "stepFunction" : null, "variables" : [ "W", "b" ] } ], "dataType" : "FLOAT", "epochCount" : 0, "inferenceWorkspaceMode" : "ENABLED", "inputPreProcessors" : { "1" : { "@class" : "org.deeplearning4j.nn.conf.preprocessor.FeedForwardToRnnPreProcessor" }, "2" : { "@class" : "org.deeplearning4j.nn.conf.preprocessor.RnnToFeedForwardPreProcessor" } }, "iterationCount" : 0, "tbpttBackLength" : 20, "tbpttFwdLength" : 20, "trainingWorkspaceMode" : "ENABLED", "validateOutputLayerConfig" : true }

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010

Jag jobbar inte aktivt med java utan C# och där finns det ju väldigt bra paket för att hantera sådant, Newtonsofts är väl vanligast för JSON. Det måste väl finnas något liknande för Java?

Sen ska du väl inte behöva redigera din genererade JSON manuellt, för då har du ju gjort något fel i koden som gjort att den inte genererats korrekt liksom.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av snajk:

Jag jobbar inte aktivt med java utan C# och där finns det ju väldigt bra paket för att hantera sådant, Newtonsofts är väl vanligast för JSON. Det måste väl finnas något liknande för Java?

Sen ska du väl inte behöva redigera din genererade JSON manuellt, för då har du ju gjort något fel i koden som gjort att den inte genererats korrekt liksom.

Det är säkert samma tankesätt bakom Dessutom har Java och C# samma syntax.

Jag har gjort en klass som heter DL4JJsonConfiguration. Nu gäller det bara för mig att kunna skriva in JSON kod till fälten. Problemet är att jag vet inte hur jag ska göra detta.

Det jag har problem med är att kunna sätta dessa fält.

private IUpdater updater; // exempel = new Sgd(learningRate); private ArrayList<Layer> layerList = new ArrayList<Layer>(); // exempel new DenseLayer.Builder() .nIn(4) .nOut(3) .activation(Activation.TANH) .build();

För att det är just objekt som innehåller argument! Hur ska jag göra här?

public class DL4JJsonConfiguration { /* * Global configuration */ private long seed; private WeightInit weightInit; private IUpdater updater; // exempel = new Sgd(learningRate); private double learningRate; private String regularization; // "L1" or "L2" private double regularizationCoefficient; /* * Layer configuration */ private ArrayList<Layer> layerList = new ArrayList<Layer>(); public DL4JJsonConfiguration() { // TODO Auto-generated constructor stub } public void insertJson(String json) { // TODO: Inser Json-sträng till alla dessa fält, vissa fält kan också vara null om behovet ej finns } public void reciveJson(String filePath) { // TODO: Generera en Json-sträng och spara den i filePath } public void generateConfiguration() { /* * Global configuration */ DL4JModel.builder = new NeuralNetConfiguration.Builder(); DL4JModel.builder.seed(seed); DL4JModel.builder.weightInit(weightInit); DL4JModel.builder.updater(updater); if(regularization.equals("L1") == true) DL4JModel.builder.l1(regularizationCoefficient); else DL4JModel.builder.l2(regularizationCoefficient); /* * Layer configuration */ DL4JModel.listBuilder = new ListBuilder(DL4JModel.builder); for(Layer layer : layerList) { DL4JModel.listBuilder.layer(layer); } } }

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004

Ta en titt på Gson biblioteket om du inte redan gjort det.
Det är gjort av Google för att konvertera java objekt fram och tillbaka till Json.

github.com/google/gson

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av mwi:

Ta en titt på Gson biblioteket om du inte redan gjort det.
Det är gjort av Google för att konvertera java objekt fram och tillbaka till Json.

github.com/google/gson

Så om jag har ett fält som lyder så här så fungerar det utmärkt att "importera in" från JSON?

private ArrayList<Activation> activationList = new ArrayList<Activation>();

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004
Skrivet av heretic16:

Så om jag har ett fält som lyder så här så fungerar det utmärkt att "importera in" från JSON?

private ArrayList<Activation> activationList = new ArrayList<Activation>();

Detta borde fungera, har dock inte testat:

Gson gson = new Gson(); ArrayList<Activation> activationList = new ArrayList<Activation>(); //Till json String json = gson.toJson(activationList ); //och tillbaka ArrayList<Activation> activationList2 = gson.fromJson(json, ArrayList<Activation>);

Kräver naturligtvis Gson biblioteket

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av mwi:

Detta borde fungera, har dock inte testat:

Gson gson = new Gson(); ArrayList<Activation> activationList = new ArrayList<Activation>(); //Till json String json = gson.toJson(activationList ); //och tillbaka ArrayList<Activation> activationList2 = gson.fromJson(json, ArrayList<Activation>);

Kräver naturligtvis Gson biblioteket

Vad tror du om detta då? Här sparar jag ALLA privata fält, vilket jag ska också göra.
Din sista kodrad ska jag studera vidare på

/** * Save Json file * @param filePath Our file path */ public void saveJson(String filePath) { try { String json = new Gson().toJson(this); // this betyder att vi tar allt! BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(json); writer.close(); } catch (IOException e) { new Dialogs().exception("Cannot write json file:\n" + filePath, e); } }

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004

@heretic16: Borde fungera, bara att testa

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av mwi:

@heretic16: Borde fungera, bara att testa

Din kod gav ett error här. Synd-tax error

activationList = gson.fromJson(json, ArrayList<Activation>);

Går det ens att göra så här?

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@heretic16: Att spara en datastruktur i ett format som kan lagras eller överföras kallas för serialisering (eng. serialization). Kan vara bra att veta om du inte redan gör det, så blir det enklare att googla lösningar

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av perost:

@heretic16: Att spara en datastruktur i ett format som kan lagras eller överföras kallas för serialisering (eng. serialization). Kan vara bra att veta om du inte redan gör det, så blir det enklare att googla lösningar

Jag har aldrig hört talas som serialization, för än idag. Är jag behov utav det?
Vad tror du om detta förslag?

public void insertJson(String filePath) { try { /* * Read the JSON file */ BufferedReader reader = new BufferedReader(new FileReader(filePath)); String json = reader.readLine(); reader.close(); Gson gson = new Gson(); /* * Import all */ seed = gson.fromJson(json, long.class); weightInit = gson.fromJson(json, WeightInit.class); updaterName = gson.fromJson(json, String.class); learningRate = gson.fromJson(json, double.class); momentum = gson.fromJson(json, double.class); regularizationName = gson.fromJson(json, String.class); regularizationCoefficient = gson.fromJson(json, double.class); layerList = gson.fromJson(json, new TypeToken<ArrayList<String>>(){}.getType()); nInList = gson.fromJson(json, new TypeToken<ArrayList<Integer>>(){}.getType()); nOutList = gson.fromJson(json, new TypeToken<ArrayList<Integer>>(){}.getType()); activationList = gson.fromJson(json, new TypeToken<ArrayList<Activation>>(){}.getType()); lossFunctionList = gson.fromJson(json, new TypeToken<ArrayList<LossFunctions.LossFunction>>(){}.getType()); } catch (IOException e) { new Dialogs().exception("Cannot read json file:\n" + filePath, e); } }

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004

@heretic16:

Du ska inte konvertera varenda variabel. Konvertera hela klassen istället.

NamnetPåDinClass objekt = gson.fromJson(json, NamnetPåDinClass.class);

Finns en del exempel här: https://github.com/google/gson/blob/master/UserGuide.md

Jag brukar skriva en statisk metod som tar in json strängen och returnerar ett objekt av klassen

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004
Skrivet av heretic16:

Jag har aldrig hört talas som serialization, för än idag. Är jag behov utav det?

Något förenklat kan man säga serialisering är när du konverterar en datastruktur tex ett objekt till ett format som är enklare att spara, tex en Json sträng.
Deserialisering är när du konverterar tillbaka.

gson.toJson = serialisering
gson.fromJson = deserialisering

Trädvy Permalänk
Medlem
Plats
Skåne
Registrerad
Maj 2004
Skrivet av heretic16:

Din kod gav ett error här. Synd-tax error

Som sagt så har jag inte testat koden
Detta borde fungera bättre: (Obs, fortfarande inte testat)

gson.fromJson(json, new TypeToken<ArrayList<Activation>>(){}.getType());

Trädvy Permalänk
Entusiast
Testpilot
Plats
Göteborg
Registrerad
Aug 2011
Skrivet av heretic16:

public class DL4JJsonConfiguration { private String regularization; // "L1" or "L2" // … public void generateConfiguration() { // … if(regularization.equals("L1") == true) DL4JModel.builder.l1(regularizationCoefficient); else DL4JModel.builder.l2(regularizationCoefficient); // … } }

Har inte grävt ner mig i koden, men detta ser ut som ett solklart exempel på när en enum är en mycket ärligare typ än String.

enum Regularization { L1, L2 }

Och som sagt: Explicita jämförelser med true (som i regularization.equals("L1") == true) är bara störande för den som ska läsa/redigera och tillför ingenting av värde. Om något introducerar det i vissa fall, helt i onödan, en extra möjlig bugg du kan råka införa:

class Main { public static void main(String[] args) { boolean x = false; if (x = true) { System.out.println("x is true"); } } }

Tänk också på att det är extremt lurigt att skriva if- och if … else-satser med de inre satserna på en egen rad som du gör, vilket kan visa sig när någon (till exempel du) redigerar koden i framtiden:

if(regularization.equals("L1") == true) DL4JModel.builder.l1(regularizationCoefficient); else DL4JModel.builder.l2(regularizationCoefficient); + System.out.println("regularization is not L1");

Jag rekommenderar i allmänhet något av följande alternativ:

Redundanta måsvingar

if (condition) { doSomething(); } else { doSomethingElse(); }

Samma rad

if (condition) doSomething(); else doSomethingElse();

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av heretic16:

Jag har aldrig hört talas som serialization, för än idag. Är jag behov utav det?

Serialisering är vad du redan verkar hålla på med. Jag ville bara upplysa dig om vad tekniken heter för att göra det enklare för dig att själv hitta mer information om ämnet. Det är en väldigt vanlig programmeringsteknik, och Java har bl.a. inbyggd serialisering i form av java.io.Serializable.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av perost:

Serialisering är vad du redan verkar hålla på med. Jag ville bara upplysa dig om vad tekniken heter för att göra det enklare för dig att själv hitta mer information om ämnet. Det är en väldigt vanlig programmeringsteknik, och Java har bl.a. inbyggd serialisering i form av java.io.Serializable.

Då förstår jag varför det heter så. Man skriver alltså fälten till filer, eller filer till fälten

Men varför har Gson stöd för Java då? Om Java redan har eget?

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av Alling:

Har inte grävt ner mig i koden, men detta ser ut som ett solklart exempel på när en enum är en mycket ärligare typ än String.

enum Regularization { L1, L2 }

Och som sagt: Explicita jämförelser med true (som i regularization.equals("L1") == true) är bara störande för den som ska läsa/redigera och tillför ingenting av värde. Om något introducerar det i vissa fall, helt i onödan, en extra möjlig bugg du kan råka införa:

class Main { public static void main(String[] args) { boolean x = false; if (x = true) { System.out.println("x is true"); } } }

Tänk också på att det är extremt lurigt att skriva if- och if … else-satser med de inre satserna på en egen rad som du gör, vilket kan visa sig när någon (till exempel du) redigerar koden i framtiden:

if(regularization.equals("L1") == true) DL4JModel.builder.l1(regularizationCoefficient); else DL4JModel.builder.l2(regularizationCoefficient); + System.out.println("regularization is not L1");

Jag rekommenderar i allmänhet något av följande alternativ:

Redundanta måsvingar

if (condition) { doSomething(); } else { doSomethingElse(); }

Samma rad

if (condition) doSomething(); else doSomethingElse();

Jag har tagit till mig det du skrev och inför detta. Utom enum. Det passar inte just mitt problem. Men tack för informationen. Jag har ordnat if-satserna så att dom är mer lättläsliga. Men själva == true eller == false har jag kvar

Jag tycker att dom passar väldigt bra med mina pop-up dialoger. "Do you want to delete" == true

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av heretic16:

Men varför har Gson stöd för Java då? Om Java redan har eget?

Javas inbyggda använder ett eget binärt format medan Gson använder JSON. Om det är JSON du vill använda så är Gson troligtvis vad du vill använda alltså.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av perost:

Javas inbyggda använder ett eget binärt format medan Gson använder JSON. Om det är JSON du vill använda så är Gson troligtvis vad du vill använda alltså.

Jag är inte speciellt beroende av något format alls. Så jag kan ju använda Javas egna med tanke på att det är säkert mer optimerat än Gson?

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007
Skrivet av heretic16:

Jag är inte speciellt beroende av något format alls. Så jag kan ju använda Javas egna med tanke på att det är säkert mer optimerat än Gson?

Visst, om allt du vill göra är att skriva ut en datastruktur till fil och sen läsa in den igen utan krav på att filen ska vara läslig för människor så är ett binärt format troligtvis att föredra ändå. Det är bara att testa vilket som fungerar bäst för dig, sidan jag länkade tidigare visar hur man använder Javas Serializable-interface.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av perost:

Visst, om allt du vill göra är att skriva ut en datastruktur till fil och sen läsa in den igen utan krav på att filen ska vara läslig för människor så är ett binärt format troligtvis att föredra ändå. Det är bara att testa vilket som fungerar bäst för dig, sidan jag länkade tidigare visar hur man använder Javas Serializable-interface.

Jag ska tänka på detta lite snare. Först få allt fungera Där efter optimerar jag.

Vad skulle du rekommendera?

1. Använda statiska fält för att komma åt fält från andra klasser? static är väll dålig programmering?
2. Använda serialition för att initialisera fält från json-filer så att jag kan komma åt värderna?
3. Dependency Injection för att komma åt alla fält.

Jag har tre klasser. Vi kallar dom för JSON-klassen. Den läser och skriver json-filer från de privata fälten. Sedan har jag Model-klassen. Denna klass sätter fälten i JSON-klassen. Sista klassen är en fxml-kontroller klass som är genererad från scene builder via dependency injection. Denna är också behov av de privata fälten från JSON-klassen.

Alltså jag är behov av de privata fälten från olika klasser. Passar JSON, Statiska fält eller Dependency injection mig om jag vill få en liten "portal" som kan ge mig fälten.

Jag har ju lärt mig kunna använda Spring IOC Men frågan är om det verktyget passar bra här. Jag är behov av lite "global varibles" känsla nu.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010
Skrivet av heretic16:

Jag ska tänka på detta lite snare. Först få allt fungera Där efter optimerar jag.

Vad skulle du rekommendera?

1. Använda statiska fält för att komma åt fält från andra klasser? static är väll dålig programmering?
2. Använda serialition för att initialisera fält från json-filer så att jag kan komma åt värderna?
3. Dependency Injection för att komma åt alla fält.

Jag har tre klasser. Vi kallar dom för JSON-klassen. Den läser och skriver json-filer från de privata fälten. Sedan har jag Model-klassen. Denna klass sätter fälten i JSON-klassen. Sista klassen är en fxml-kontroller klass som är genererad från scene builder via dependency injection. Denna är också behov av de privata fälten från JSON-klassen.

Alltså jag är behov av de privata fälten från olika klasser. Passar JSON, Statiska fält eller Dependency injection mig om jag vill få en liten "portal" som kan ge mig fälten.

Jag har ju lärt mig kunna använda Spring IOC Men frågan är om det verktyget passar bra här. Jag är behov av lite "global varibles" känsla nu.

Att använda en textfil för att komma åt saker mellan klasser i samma applikation är katastrof, du behöver tänka om. Varför private? Interface?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av snajk:

Att använda en textfil för att komma åt saker mellan klasser i samma applikation är katastrof, du behöver tänka om. Varför private? Interface?

Okej. Då är JSON inte en lösning i mitt fall.
Då återstår DI eller statiska fält.

DI ser väll inte till så fälten får samma address?

Jag höll på med DI för ett tag sedan, men det gav inte samma address på samma fält.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
På yogamatta
Registrerad
Jul 2011
Skrivet av heretic16:

Okej. Då är JSON inte en lösning i mitt fall.
Då återstår DI eller statiska fält.

DI ser väll inte till så fälten får samma address?

Dependency injection i Spring är väl alltid Singleton om du inte går in och ändrar det har jag för mig.

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av Xenofonus:

Dependency injection i Spring är väl alltid Singleton om du inte går in och ändrar det har jag för mig.

Skickades från m.sweclockers.com

Vad menas med Singelton? Jag läser lite nu på wikipedia, men får inte riktigt det greppa. Är det att alla fält i klassen får samma adress?

När jag använde Spring IOC så använde jag. Men detta gav inte samma adress på fälten.

ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Entusiast
Testpilot
Plats
Göteborg
Registrerad
Aug 2011
Skrivet av heretic16:

1. Använda statiska fält för att komma åt fält från andra klasser?

Du menar väl public, inte static?

Citat:

static är väll dålig programmering?

Varifrån har du fått detta? Varför skulle det vara det?

Skrivet med hjälp av Better SweClockers

Trädvy Permalänk
Medlem
Plats
På yogamatta
Registrerad
Jul 2011
Skrivet av heretic16:

Vad menas med Singelton? Jag läser lite nu på wikipedia, men får inte riktigt det greppa. Är det att alla fält i klassen får samma adress?

När jag använde Spring IOC så använde jag. Men detta gav inte samma adress på fälten.

ApplicationContext context = new FileSystemXmlApplicationContext("beans.xml");

When a bean is a singleton, only one shared instance of the bean will be managed, and all requests for beans with an id or ids matching that bean definition will result in that one specific bean instance being returned by the Spring container.

To put it another way, when you define a bean definition and it is scoped as a singleton, then the Spring IoC container will create exactly one instance of the object defined by that bean definition. This single instance will be stored in a cache of such singleton beans, and all subsequent requests and references for that named bean will result in the cached object being returned.

Jag är ingen expert på detta men kolla så du inte har slagit på något annat scope än default/singleton. Kan ligga i den där XML-filen om du använder dig av den för att konfigurera dina beans.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av Alling:

Du menar väl public, inte static?

Varifrån har du fått detta? Varför skulle det vara det?

Ja. Public static menar jag.

Jag har hört att static är anti-oop.

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jun 2008
Skrivet av Xenofonus:

When a bean is a singleton, only one shared instance of the bean will be managed, and all requests for beans with an id or ids matching that bean definition will result in that one specific bean instance being returned by the Spring container.

To put it another way, when you define a bean definition and it is scoped as a singleton, then the Spring IoC container will create exactly one instance of the object defined by that bean definition. This single instance will be stored in a cache of such singleton beans, and all subsequent requests and references for that named bean will result in the cached object being returned.

Jag är ingen expert på detta men kolla så du inte har slagit på något annat scope än default/singleton. Kan ligga i den där XML-filen om du använder dig av den för att konfigurera dina beans.

Alltså är Spring IOC ungefär samma sak som public static?

| CPU: MMX 200 MHz Intel Pentium I| GPU: Voodo2 3dfx 8 Mb| RAM: SDRAM 32 Mb 133 Mhz | PSU: 3V fläkt 2W | Chassi: HP Vectra VE 5| Skärm: HP Ergo 1024| HDD: Toshiba 2033 MB | OS: Windows 95 B | Mus: HP |