| Autor |
Beitrag |
funcry
      
Beiträge: 110
Erhaltene Danke: 1
Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
|
Verfasst: Di 30.12.08 11:41
Vermutlich trivial, aber als Umsteiger scheitere ich momentan an diesen Problem:
Dieses Struct:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| [Serializable] public struct TSample { public double[] vs_i; public double v_o; } |
speichere ich mehrfach in einer Datei.
Und will es an einer anderen Stelle wieder in
C#-Quelltext
einlesen.
So sieht meine Speichern Routine aus.
Diese läuft sauber durch, und ich erhalte eine Datei mit etwa 1 MB Grösse was passen müsste:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62:
| public bool create_samples(int n_ics, string Filename_samples) { bool result = false; int x; int y; int m; double[] vs_i; Color[,] img;
img = new Color[xm, ym];
TSample sample = new TSample(); sample.vs_i = new double[n_ics];
vs_i = new double[n_ics];
try { FileStream fstream = new FileStream(Filename_samples, FileMode.Create, FileAccess.Write); MemoryStream memoryStream = new MemoryStream(); BinaryFormatter formatter = new BinaryFormatter();
for (x = 1; x <= img_depht; x++) { for (y = 1; y <= img_cnt; y++) { for (m = 0; m <= 1; m++) { img_create_sfe_show(ref img, x, m); img_to_vs_i(ref vs_i, n_ics, ref img); sample.vs_i = vs_i; switch (m) { case 0: sample.v_o = 0.2; break; case 1: sample.v_o = 0.8; break; }
formatter.Serialize(memoryStream, sample); fstream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); memoryStream.Flush(); } } } fstream.Close(); memoryStream.Dispose();
result = true; this.Msg(false, "Input pattern saved to file."); }
catch (Exception E) { this.Msg(true, "Error saving input pattern." + ' ' + E.Source + ' ' + E.Message); } return result; } |
So sieht meine Lesen Routine aus:
Für den Anfang versuche ich zumindest ein Sample auszulesen, in der Hoffnung dass ich auf die gleiche Weise dann weitere Samples auslesen kann bis das Dateiende erreicht ist.
Hinweis: 3 Varianten ausprobiert, die jeweilige Fehlermeldung ist als Kommentar beigefügt.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52:
| private bool file_to_samples( ref TSample[] Samples, ref int cnt, string kind) { bool Result = false; FileStream f = null;
TSample Sample = new TSample(); Sample.vs_i= new double[n_ics];
BinaryFormatter formatter = new BinaryFormatter(); MemoryStream memoryStream = new MemoryStream(); formatter.Serialize(memoryStream, Sample); int mySize = (int) memoryStream.Length; memoryStream.flush(); try { switch(kind) { case "teach": f = new FileStream(Filename_teach_samples, FileMode.Open, FileAccess.Read); break; case "check": f = new FileStream(Filename_check_samples, FileMode.Open, FileAccess.Read); break; }
Samples = (TSample[])formatter.Deserialize(f);
Sample = (TSample)formatter.Deserialize(f);
f.Read(memoryStream.GetBuffer(), 0, mySize); Sample = (TSample) formatter.Deserialize(memoryStream);
Result = true; } catch (Exception E) { this.Msg(true, "Error reading samples from file." + ' ' + E.Source + ' ' + E.Message); } return Result; } |
An diesem Problem bleibe ich derzeit stecken, kann mir jemand auf die Sprünge helfen das Problem zu lösen ?
|
|
funcry 
      
Beiträge: 110
Erhaltene Danke: 1
Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
|
Verfasst: Mi 31.12.08 19:27
Problem gelöst. Über den Umweg einer ArrrayList funktioniert es (wobei auch heir serialisiert werden muss).
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Do 01.01.09 10:33
Hallo,
da ich mich mit Serialisierung noch nicht befasst habe, konnte ich Dir nicht helfen und verstehe auch Dein Vorgehen nicht wirklich. Aber eines weiß ich:
| Zitat: | herbivore hat geschrieben:
ArrayList gehört in die Mottenkiste und sollte wie alle untypisierten Collections aus System.Collections nicht mehr benutzt werden. Verwende stattdessen List<T> und alle anderen typisierten Collections aus System.Collections.Generic. |
Gruß und Frohes Neues Jahr! Jürgen
|
|
funcry 
      
Beiträge: 110
Erhaltene Danke: 1
Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
|
Verfasst: Sa 03.01.09 19:25
Danke für den Hinweis. Ich habe es inzwischen in eine List <int> bzw. List <double> umgesetzt. Der Vollständigkeit halber hier die beiden Routinen:
Hinweis: Für jeden weiteren Tipp bin ich dankbar
Das Struct:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| [Serializable] public struct TSample { public int[] vs_i; public double v_o; } |
Speichern der Samples:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| public bool create_samples(int n_ics, string Filename_samples) { bool result = false; int x; int y; int m; Color[,] img;
TKNN.TSample Sample = new TKNN.TSample(); Sample.vs_i = new int[n_ics];
List<TKNN.TSample> Samples = new List<TKNN.TSample>();
for (x = 1; x <= img_depht; x++) { for (y = 1; y <= img_cnt; y++) { for (m = 0; m <= 1; m++) { img_create_sfe_show(out img, x, m); img_to_vs_i(out Sample.vs_i, n_ics, img); switch (m) { case 0: Sample.v_o = 0.2; break; case 1: Sample.v_o = 0.8; break; } Samples.Add(Sample); } } }
FileStream fstream = new FileStream(Filename_samples, FileMode.Create, FileAccess.Write); BinaryFormatter formatter = new BinaryFormatter(); MemoryStream mstream = new MemoryStream(); formatter.Serialize(mstream, Samples);
try { try { fstream.Write(mstream.GetBuffer(), 0, (int)mstream.Length); result = true; this.Msg(false, "Input pattern saved to file."); } catch (Exception E) { this.Msg(true, "Error saving input pattern." + " " + E.Source + " " + E.Message); } } finally { fstream.Close(); mstream.Dispose(); } return result; } |
Laden der Samples:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| private bool file_to_samples( out List<TSample> Samples, string kind) { bool Result = false; FileStream f = null; Samples = new List<TSample>();
BinaryFormatter formatter = new BinaryFormatter(); try { switch (kind) { case "teach": f = new FileStream(Filename_teach_samples, FileMode.Open, FileAccess.Read); break; case "check": f = new FileStream(Filename_check_samples, FileMode.Open, FileAccess.Read); break; } try { Samples = (List<TSample>)formatter.Deserialize(f); Result = true; } catch (Exception E) { this.Msg(true, "Error reading samples from file." + " " + E.Source + " " + E.Message); } } finally { f.Close(); }
return Result; } |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 03.01.09 22:35
Wozu der MemoryStream? Du kannst auch direkt in den FS serialisieren.
Dann wären da noch ein paar Formsachen  :
Aussagekräftige Namen sind immer schön, Unterstriche gehören unter Strafe verboten, Typen ohne T-Präfix, besonders Schleifenvariablen erst dann deklarieren, wenn man sie braucht, Nested Classes (TKNN.TSample) sind meistens unnötig, Parameter und Variablen klein schreiben, den try-Block kannst du durch usingersetzen.
_________________ >λ=
|
|
funcry 
      
Beiträge: 110
Erhaltene Danke: 1
Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
|
Verfasst: So 04.01.09 01:23
Danke für die Hinweise!
MemoryStream war überflüssig,
T-Präfixe entfernt,
Schleifenvariablen sind jetzt in der Schleife deklariert, dadurch sogar einen Fehler entdeckt(!).
Nested class durch Vererbung umgangen (erforderlich, da Speichern und Lesen der Sampels in jeweils anderen Klassen deklariert sind),
Using genutzt (sehr praktisch!).
Die Änderungen habe ich auf das gesamte Projekt angewendet. Danke nochmal für die Tipps.
(Unterstriche sowie kleine Variablennamen werde ich mir noch durch den Kopf gehen lassen müssen.)
Anbei nochmal die beiden Routinen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| private bool file_to_samples( out List<Sample> Samples, string kind) { bool Result = false; string FileName = null;
Samples = new List<Sample>();
switch (kind) { case "teach": FileName = Filename_teach_samples; break; case "check": FileName = Filename_check_samples; break; }
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream f = new FileStream(FileName, FileMode.Open, FileAccess.Read)) { try { Samples = (List<Sample>)formatter.Deserialize(f); Result = true; } catch (Exception E) { this.Msg(true, "Error reading samples from file." + " " + E.Source + " " + E.Message); } }
return Result; } |
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50:
| public bool create_samples(int n_ics, string Filename_samples) { bool result = false; Color[,] img;
Sample mySample = new Sample(); mySample.vs_i = new int[n_ics];
List<Sample> mySamples = new List<Sample>();
for (int x = 1; x <= img_depht; x++) { for (int y = 1; y <= img_cnt; y++) { for (int m = 0; m <= 1; m++) { img_create_sfe_show(out img, x, m); img_to_vs_i(out mySample.vs_i, n_ics, img); switch (m) { case 0: mySample.v_o = 0.2; break; case 1: mySample.v_o = 0.8; break; } mySamples.Add(mySample); } } }
BinaryFormatter formatter = new BinaryFormatter();
using (FileStream f = new FileStream(Filename_samples, FileMode.Create, FileAccess.Write)) { try { formatter.Serialize(f, mySamples); result = true; this.Msg(false, "Input pattern saved to file."); } catch (Exception E) { this.Msg(true, "Error saving input pattern." + " " + E.Source + " " + E.Message); } }
return result; } |
|
|
|