none
Array lokal speichern RRS feed

  • Frage

  • Ich will einen Array (double) fest auf der Festplatte speichern.

     

    Danke schon jetzt!


    LT-Tec
    Samstag, 25. Juni 2011 07:12

Antworten

  • Hallo LT-Tec,

    Hier ein Beispiel zur binären Serialisierung/Deserialisierung eines double-Arrays (von Thomas und Konrad bereits angesprochen):

    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace ConsoleApplication1 {
      class Program {
        static void Main() {
          double x = 4d/3d;
          double y = 5d/3d;
          double z = 3d/2d;
    
          double[] sourceArray = new[] { x, y, z };
    
          BinaryFormatter formatter = new BinaryFormatter();
          string fileDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
          string filePath = Path.Combine(fileDirectory, "doubles.bin");
          
          using (FileStream writeStream = File.OpenWrite(filePath)) {
          		formatter.Serialize(writeStream, sourceArray);
          }
    
          double[] deserializedArray;
    
          using(FileStream readStream = File.OpenRead(filePath)) {
            deserializedArray = (double[]) formatter.Deserialize(readStream);
          }
    
          bool areEqual = true;
    
          for (int i = 0; i < sourceArray.Length; i++) {
            if (sourceArray[i] == deserializedArray[i])
              continue;
    
            areEqual = false;
            break;
          }
    
          Console.WriteLine("Werte sind gleich: {0}", areEqual ? "JA" : "NEIN");
          Console.ReadKey(true);
        }
      }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert Anonym2000 Samstag, 25. Juni 2011 10:25
    Samstag, 25. Juni 2011 08:21
    Moderator

Alle Antworten

  • Hi,

    Ich will einen Array (double) fest auf der Festplatte speichern.

    Und die Frage?

    Du kannst kein Objekt auf Platte speichern. Höchstens eine als String (oder binär) umgesetzte Form des Objekts.

    double[] myArray = new double[3];
    myArray[0] = 1;
    myArray[1] = 5;
    myArray[2] = 10;

    System.IO.File.WriteAllText( @"X:\Ordner\myArray.txt", String.Join( ",", myArray ) );



    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 25. Juni 2011 07:49
    Moderator
  • Hallo L

    falls binäre (native) Datei, Ansätze ua etwa:

    umkopieren in Byte-Array

    Buffer.BlockCopy Method
    http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx

    File.WriteAllBytes Method
    http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

    oder Elemente je einzeln:

    BinaryWriter.Write Method (Double)
    http://msdn.microsoft.com/en-us/library/ez8wcba9.aspx


    ggf low-level, ohne umkopieren:

    GCHandle.AddrOfPinnedObject
    http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.gchandle.addrofpinnedobject.aspx

    plus/oder uU unsafe/pointer/PInvoke.

    Es sei denn du nimmst 'normale' (.NET-spezifische, -XML) Serialisierung, uva
    http://msdn.microsoft.com/en-us/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx


    Samstag, 25. Juni 2011 07:58
  • Hallo,

    Du hast ja schon einige Anregungen bekommen.

    Ich möchte Dich darüber hinaus einfach nur mit der Nase auf ein paar Suchbegriffe stoßen:

    "(De)Serialisierung" ist das Fachwort, welches sinnvoll ist in dem Zusammenhang. Dabei gibt es verschiedene Arten. Binary Serialisierung legt die Daten im Binärformat ab. Hat den Vorteil, dass dies relativ klein bleibt aber dafür ist es extrem unleserlich und für Dritte nicht wirklich verarbeitbar.

    XML Serialisierung ist die zweite wichtige Art der Serialisierung. Hier ist das Ergebnis eine XML Datei, welche einfach lesbar ist und auch für Dritte verarbeitbar sein kann. Das erkauft man sich aber durch eine um so größere Datei.

    Es gibt noch andere Dinge, die aber erst einmal irrelevant sind denke ich mal.

    Mit Google / Bing sollte sich hierzu viel finden lassen an Einführungen und Referenzen.

    Mit den besten Grüßen,

    Konrad

    Samstag, 25. Juni 2011 08:07
  • Hallo LT-Tec,

    Hier ein Beispiel zur binären Serialisierung/Deserialisierung eines double-Arrays (von Thomas und Konrad bereits angesprochen):

    using System;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    
    namespace ConsoleApplication1 {
      class Program {
        static void Main() {
          double x = 4d/3d;
          double y = 5d/3d;
          double z = 3d/2d;
    
          double[] sourceArray = new[] { x, y, z };
    
          BinaryFormatter formatter = new BinaryFormatter();
          string fileDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
          string filePath = Path.Combine(fileDirectory, "doubles.bin");
          
          using (FileStream writeStream = File.OpenWrite(filePath)) {
          		formatter.Serialize(writeStream, sourceArray);
          }
    
          double[] deserializedArray;
    
          using(FileStream readStream = File.OpenRead(filePath)) {
            deserializedArray = (double[]) formatter.Deserialize(readStream);
          }
    
          bool areEqual = true;
    
          for (int i = 0; i < sourceArray.Length; i++) {
            if (sourceArray[i] == deserializedArray[i])
              continue;
    
            areEqual = false;
            break;
          }
    
          Console.WriteLine("Werte sind gleich: {0}", areEqual ? "JA" : "NEIN");
          Console.ReadKey(true);
        }
      }
    }
    
    


    Gruß
    Marcel

    • Als Antwort markiert Anonym2000 Samstag, 25. Juni 2011 10:25
    Samstag, 25. Juni 2011 08:21
    Moderator
  • Hallo L.,

    ich finde immer die XML - Format sehr praktisch (also wie Konrad), da serialisiertes Format oft (auch in anderen Sprachen) auf XML basiert und man sehr viele Typen (bzw. Instanzen davon) einfach mit der gleichen Methode serialisieren (und wieder einlesen) kann und das Format nicht proprietär ist und gut lesbar.

    Hier ein Beispiel:

    using System;
    using System.IO;
    using System.Windows.Forms;
    using System.Xml.Serialization;
    using System.Diagnostics;
    
    namespace WinArrayCopy
    {
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          double[] werte = new double[] { 1.1, 2.2, 3.3, 4.4 };
          Schreiben(werte); // Process.Start(dateiPfad);
          double[] werteEingelesen = Einlesen<double>();
          Debugger.Break(); // Hier im Debugger 'werteEingelesen' anschauen 
        }
    
        static string dateiPfad = "instanzen.xml";
        static public T[] Einlesen<T>()
        {
          XmlSerializer serializer = new XmlSerializer(typeof(T[]));
          TextReader tr = new StreamReader(dateiPfad);
          T[] instanzen = (T[])serializer.Deserialize(tr); tr.Close();
          return instanzen;
        }
    
        static public void Schreiben<T>(T[] instanzen)
        {
          XmlSerializer serializer = new XmlSerializer(typeof(T[]));
          TextWriter tr = new StreamWriter(dateiPfad);
          serializer.Serialize(tr, instanzen); tr.Close();
        }
      }
    }
    

    [Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren]
    http://dzaebel.net/XmlSerializer.htm

    Weitere Formen, Möglichkeiten und Details der Serialisierung findest Du u.a. in Binäre Serialisierung oder XML- und SOAP-Serialisierung, oder allgemein in: [Serialisierung].

    Beachte aber, die Wahl der Serialisierungs-Technik hängt von Deinen Anforderungen ab. Zum Beispiel würde man für "unbedingte Größen-Minimierung" eher die binäre Serialisierung benutzen, aber die Wahl wird Dir anhand der Informationen in den oben genannten MSDN-Links erleichtert.


    ciao Frank
    Samstag, 25. Juni 2011 09:12
  • Hallo LT-Tec,

    Nachtrag: Wenn Du eine lesbare Ausgabe benötigst, kannst Du außer dem von Konrad und Frank angesprochenen XmlSerializer noch weitere Serializer aus der System.Runtime.Serialization.dll verwenden, z.B.:

    • SoapFormatter
    • NetDataContractSerializer

    Was genau Du verwendest, hängt letztlich von Deinem Einsatzszenario ab. Da mußt Du (in meinem obigen Code) lediglich die Instanziierung von BinaryFormatter durch die Instanzen von SoapFormatter oder NetDataContractSerializer ersetzen.

    Benötigst du allerdings weniger Interoperatibilität sondern eher schiere Performanz, dann führt kein Weg an den binären Formattierer vorbei.

    SoapFormatter-Klasse:
    http://msdn.microsoft.com/de-de/library/system.runtime.serialization.formatters.soap.soapformatter(v=VS.100).aspx

    BinaryFormatter-Klasse:
    http://msdn.microsoft.com/de-de/library/system.runtime.serialization.formatters.binary.binaryformatter.aspx

    NetDataContractSerializer-Klasse:
    http://msdn.microsoft.com/de-de/library/system.runtime.serialization.netdatacontractserializer.aspx

    Gruß
    Marcel


    Samstag, 25. Juni 2011 09:23
    Moderator