Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Di 30.12.08 11:41 
Vermutlich trivial, aber als Umsteiger scheitere ich momentan an diesen Problem:

Dieses Struct:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
[Serializable]
public struct TSample
{
     public double[] vs_i;
     public double v_o;
// end TSample



speichere ich mehrfach in einer Datei.
Und will es an einer anderen Stelle wieder in

ausblenden C#-Quelltext
1:
TSample[] Samples					


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:

ausblenden volle Höhe C#-Quelltext
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.

ausblenden volle Höhe C#-Quelltext
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;
                }

                // so gehts nicht:
                // Fehler:  Das Objekt des Typs "TSample" kann nicht in Typ "TSample[]" umgewandelt werden.
                Samples = (TSample[])formatter.Deserialize(f);  

                // so auch nicht:
                // Fehler: Die angegebene Umwandlung ist ungültig.
                Sample = (TSample)formatter.Deserialize(f);  

                // so auch nicht, jetzt bin ich ratlos:
                // Fehler:  Das Streamende wurde erreicht, bevor die Verarbeitung abgeschlossen wurde.
                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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mi 31.12.08 19:27 
Problem gelöst. Über den Umweg einer ArrrayList funktioniert es (wobei auch heir serialisiert werden muss).
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
[Serializable]
        public struct TSample
        {
            public int[] vs_i;
            public double v_o;
        }



Speichern der Samples:

ausblenden volle Höhe C#-Quelltext
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:

ausblenden volle Höhe C#-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: 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:

ausblenden volle Höhe C#-Quelltext
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;
        }



ausblenden volle Höhe C#-Quelltext
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;
        }