Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Singletone Objekt in Datei speichern

Mitglied: it4baer

it4baer (Level 1) - Jetzt verbinden

20.02.2018 um 07:22 Uhr, 513 Aufrufe, 12 Kommentare

Hallo,

ist es möglich ein Singleton-Objekt zu "serialisieren" und dann in eine Datei zu speichern ... um es später wieder laden zu können?

wenn ja, wie ist hier die Herangehensweise

Vielen Dank
Mitglied: emeriks
20.02.2018 um 08:10 Uhr
Hi,
wenn man ein Instanz einer Klasse serialisieren kann, dann kann man das Byte Array auch in eine Datei schreiben und von dort wieder laden und die Instanz der Klasse daraus wieder deserialisieren. Ob man eine Klasse serialisieren kann, hängt im Wesentlichen von den verwendeten Datentypen der Member ab.

Ist Deine Frage jetzt wie man generell serialisiert oder wie man speziell ein Singleton-Objekt serialisiert?

E.
Bitte warten ..
Mitglied: it4baer
20.02.2018 um 08:28 Uhr
Hm,

vielen Dank... gute Frage...
ich habe gesehen, man kann eine Singleton-Klasse erweitern und dann die Felder zum Serialisieren zurückgeben... aber das ist mal wieder Aufwand der es nicht gerechtfertigt...

Interessant wäre eigentlich das Objekt "ohne" Veränderung ... zumindest großer Veränderung zu Serialisieren... in meiner Singleton sind neben Parametern (Bool, Int und String) auch z.B. DataSets.

Ich stell mir immer vor, alles muss ja irgendwie (z.B. im Arbeitsspeicher) in Nullen und Einsen abgelegt werden... nun stellt sich die Fragen ob man nicht das Irgendwie abgreifen kann und eben wieder Nachladen.

speichern <- mal einfach ausgedrückt
Singleton mySingle = Singleton.Init
byte[] saveData = mySingle.serialize;
saveData => toFile

laden
fromFile => saveData
Singleton mySingle = saveData.deserialize;

die Singleton sollte dabei "wenn möglich" nicht oder nur minimal angepasst werden...
=> das ganze "komplett" umzuschreiben, wäre natürlich SICHER möglich... aber dann kann ich auch einfach die relevanten Felder abgreifen und Speichern/Laden (ich such also nach einen Effizienten und Eleganten Weg)

... nein, ich will nicht, dass man mir hier die Arbeit macht und obwohl ich nicht das Rad neu erfinden will, hab ich auch nichts gegen Fleißarbeit... aber es gibt bekannterweise viele Wege welche nach Rom führen und ich suche den "effizientesten" <- also nicht zwingend den Kürzesten aber auch nicht den, bei welchen der komplette Sprit drauf geht, nur um erster zu sein...
Bitte warten ..
Mitglied: emeriks
LÖSUNG 20.02.2018, aktualisiert um 08:41 Uhr
Nu vergiss mal das Singleton. Das hat ja m.E. nichts damit zu tun. Es ändert nichts, ob das Objekt nun ein Singleton ist oder nicht. Oder?

Mit u.g. Code kann man Objekte in Byte Arrays "umwandeln" und vice versa.
Aber auch nur dann, wenn alle verwendeten Datentypen innerhalb der Klasse dies unterstützen.
Die Klasse muss als serialisierbar gekennzeichnet sein.

Basic serialization
Object Serialization in the .NET Framework


01.
 ''' <summary>
02.
  ''' Liefert ein beliebiges Objekt als eindimensionales Byte-Array zurück.
03.
  ''' </summary>
04.
  ''' <param name="TheObject">Das zu "übersetzende" Objekt.</param>
05.
  ''' <returns>Byte-Array</returns>
06.
  Public Function ObjectToByteArray(ByVal TheObject As Object) As Byte()
07.
    Try
08.
      Dim ms As New System.IO.MemoryStream()
09.
      Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
10.
      bf.Serialize(ms, TheObject)
11.
      Return ms.ToArray()
12.
    Catch Ex As Exception
13.
      Return Nothing
14.
    End Try
15.
  End Function
16.

17.
  ''' <summary>
18.
  ''' Liefert ein beliebiges, eindimensionales Byte-Array als Objekt zurück.
19.
  ''' </summary>
20.
  ''' <param name="ByteArray">Das zu "übersetzende" Byte-Array.</param>
21.
  ''' <returns>Object</returns>
22.
  Public Function ByteArrayToObject(ByVal ByteArray() As Byte) As Object
23.
    Try
24.
      Dim ms As New System.IO.MemoryStream(ByteArray)
25.
      Dim bf As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()
26.
      ms.Position = 0
27.
      Return bf.Deserialize(ms)
28.
    Catch Ex As Exception
29.
      Return Nothing
30.
    End Try
31.
  End Function
Bitte warten ..
Mitglied: it4baer
21.02.2018, aktualisiert um 10:58 Uhr
funktioniert perfekt...

ich habe noch eine andere Anwendung in welcher ein INotifyPropertyChanged inkludiert ist...
zwar speichert und Lädt er die Singleton perfekt, aber die Oberfläche ist irgendwie außenvor
=> was so viel heißt dass beim ersten jungfreulichen Laden alles gut funktioniert, er die Daten beim Beenden speichert, beim Laden die Daten lädt, aber die Oberfläche erstens die Werte nicht zugeordnet bekommen und 2. auch neue Werte aus der Oberfläche nicht in die Singleton übernimmt.

mein Singleton sieht so aus:

01.
[Serializable]
02.
public class Singleton : INotifyPropertyChanged
03.
{
04.
	private readonly List<Delegate> _serializableDelegates;
05.

06.
	private static Singleton instance;
07.
	private Singleton()
08.
	{
09.
		_serializableDelegates = new List<Delegate>();
10.
	}
11.

12.
	public static Singleton Instance
13.
	{
14.
		get
15.
		{
16.
			if (instance == null)
17.
			{
18.
				instance = new Singleton();
19.
			}
20.
			return instance;
21.
		}
22.
	}
23.

24.
	public DataTable MyTable { get; set; }
25.
	public bool AdminMode = false;
26.

27.
	private string text;
28.
	public string Text
29.
	{
30.
		get { return text; }
31.
		set
32.
		{
33.
			if (text != value)
34.
			{
35.
				text = value;
36.
				OnPropertyChanged(new PropertyChangedEventArgs("Text"));
37.
			}
38.
		}
39.
	}
40.

41.
	[field: NonSerialized]
42.
	public event PropertyChangedEventHandler PropertyChanged;
43.
	protected virtual void OnPropertyChanged(PropertyChangedEventArgs e)
44.
	{
45.
		PropertyChanged?.Invoke(this, e);
46.
	}
47.

48.
	protected void OnPropertyChanged(string propertyName)
49.
	{
50.
		OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
51.
	}
52.

53.
	[OnSerializing]
54.
	private void OnSerializing(StreamingContext context)
55.
	{
56.
		_serializableDelegates.Clear();
57.
		var handler = PropertyChanged;
58.

59.
		if (handler != null)
60.
		{
61.
			foreach (var invocation in handler.GetInvocationList())
62.
			{
63.
				if (invocation.Target.GetType().IsSerializable)
64.
				{
65.
					_serializableDelegates.Add(invocation);
66.
				}
67.
			}
68.
		}
69.
	}
70.

71.
	[OnDeserialized]
72.
	private void OnDeserialized(StreamingContext context)
73.
	{
74.
		foreach (var invocation in _serializableDelegates)
75.
		{
76.
			PropertyChanged += (PropertyChangedEventHandler)invocation;
77.
		}
78.
	}
79.
}
Geladen wird das so:

singleton = LoadObject("singleton.bin") == null ? Singleton.Instance : (Singleton)LoadObject("singleton.bin");

die Methode welche ich zum Laden benutz...
01.
private object LoadObject(string fileName)
02.
{
03.
	if (File.Exists(fileName))
04.
	{
05.
		try
06.
		{
07.
			using (FileStream file = new FileStream(fileName, FileMode.Open, FileAccess.Read))
08.
			{
09.
				byte[] bytes = new byte[file.Length];
10.
				file.Read(bytes, 0, (int)file.Length);
11.

12.
				try
13.
				{
14.
					using (MemoryStream ms = new MemoryStream())
15.
					{
16.
						BinaryFormatter bf = new BinaryFormatter();
17.
						ms.Write(bytes, 0, (int)file.Length);
18.
						ms.Position = 0;
19.

20.
						return bf.Deserialize(ms);
21.
					}
22.
				}
23.
				catch(Exception ex)
24.
				{
25.
					MessageBox.Show("MS: " + ex.Message);
26.
				}
27.
			}
28.
		}
29.
		catch (Exception ex)
30.
		{
31.
			MessageBox.Show("Loader: " + ex.Message);
32.
		}
33.
	}
34.
	return null;
35.
}

weiß jemand warum das Zusammenspiel mit der Oberfläche nicht mehr richtig arbeitet?
Bitte warten ..
Mitglied: emeriks
21.02.2018, aktualisiert um 11:05 Uhr
Ich kann Dir, offen gestanden, nicht ganz folgen. Bitte post mal auch Teil, wo Du mit "LoadObject" das Objekt wieder lädst.

Wenn ich doch richtig verstanden habe:
Du hast ein Objekt mit "angehängtem" Eventhandler. Dieses serialisierst Du und speicherst es in eine Datei.
Beim erneuten Start deserialisierst dieses Objekt wieder aus dieser Datei und der Eventhandler funktioniert jetzt nicht?
Falls ja:
Das ist logisch. Wenn Du ein Objekt deserialisierst, dann ist das hinterher nicht mehr das selbe Objekt sondern ein neues, welches bloß die Eigenschaften des alten bekommen hat. Auch der Eventhandler ist jetzt ein anderer. Du müsstest also nach dem Deserialisieren die Eventhandler erneut "anhängen".
Bitte warten ..
Mitglied: emeriks
21.02.2018 um 11:27 Uhr
funktioniert perfekt...
Oh, keine Ursache ....
Bitte warten ..
Mitglied: it4baer
21.02.2018 um 12:22 Uhr
ja, du hast das richtig verstanden!

das klingt alles "logisch"

Du müsstest also nach dem Deserialisieren die Eventhandler erneut "anhängen".
Wie mach ich das?

muss ich da für jedes Feld agieren, oder kann ich das irgendwie Automatisieren?
Bitte warten ..
Mitglied: emeriks
21.02.2018 um 13:14 Uhr
Ein Code-Auszug von Dir wäre hilfreich. Es muss ja nicht gleich das ganze Formular sein.
Bitte warten ..
Mitglied: it4baer
21.02.2018 um 13:37 Uhr
nun, vom prinzip ist der oben genannte Code mein Code...

ich habe in der Oberfläche folgende Felder:
<TextBox Text="{Binding Path=Text, Source={x:Static local:Singleton.Instance}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

und das Singleton ist ja oben...

01.
        private void SaveObject(object obj, string fileName)
02.
        {
03.
            try
04.
            {
05.
                using (MemoryStream ms = new MemoryStream())
06.
                {
07.
                    BinaryFormatter bf = new BinaryFormatter();
08.
                    bf.Serialize(ms, obj);
09.

10.
                    using (FileStream file = new FileStream(fileName, FileMode.Create, FileAccess.Write))
11.
                    {
12.
                        ms.WriteTo(file);
13.
                    }
14.
                }
15.
            }
16.
            catch(Exception ex)
17.
            {
18.
                MessageBox.Show(ex.Message);
19.
            }
20.
        }
hier noch das speichern

gerne liefer ich noch mehr... aber ich wüsste nicht was noch fehlt!?
Bitte warten ..
Mitglied: emeriks
21.02.2018 um 13:46 Uhr
Schreibe ich Spanisch?

Der Code, wo Du das Objekt deserialisierst! Welches Objekt ist das? Wie verwendest Du es weiter? Ist Dein Code soooo geheim? Wirst Du damit reich? Patent anmelden?
Bitte warten ..
Mitglied: it4baer
21.02.2018 um 13:57 Uhr
Sorry...

ich habe nahezu ALLES an code veröffentlicht!

Post um: 21.02.2018 um 13:37 Uhr
Hier ist die Funktion wo ich das Objekt Serialisiere...
aufgerufen wird diese:
SaveObject(Singleton.Instance, "datei.bin");

das "Objekt" der begierde
Post um: 21.02.2018, aktualisiert um 10:58 Uhr
public class Singleton : INotifyPropertyChanged
erzeugt wird das durch
Singleton.Instance.Text = "geheimer Code womit ich unglaublich viel Geld verdiene";

geladen wird das (im selben Post)
LoadObject("datei.bin");

bzw. ich machs mir einfach indem ich mir den Text Singleton.Instance spare und schreibe:

Singleton myData = Singleton.Instance;

und dann verwende ich myData.Text oder beschreibe myData.Text...
Serialisiert wird myData...

...
oder was willst du?
PS. ich mag es nicht, wenn man "unfreundlich" wird. Wenn man keine Lust hat mir zu helfen ist das Okay... wenn ich mich "sau Dumm" anstelle, dann ist das keine Absicht!
Bitte warten ..
Mitglied: emeriks
21.02.2018, aktualisiert um 14:35 Uhr
Ich muss blind sein ...
weiß jemand warum das Zusammenspiel mit der Oberfläche nicht mehr richtig arbeitet?
Welcher Oberfläche?
Welches Zusammenspiel?
Wie mach ich das?
muss ich da für jedes Feld agieren, oder kann ich das irgendwie Automatisieren?
Wie soll ich das beantworten, wenn ich nicht weiß, was Du da wie verlinkt hast?

Aber egal, ich bin raus.
Die Lösung für Dein eigentliches Serialiserungsproblem hast Du von mir bekommen, auch wenn nicht so von Dir markiert.

Viel Erfolg!
Bitte warten ..
Ähnliche Inhalte
CSS
Breite objekt mit css
Frage von jensgebkenCSS3 Kommentare

Hallo Gemeinschaft, gibt eine Möglichkeit einen bild 100% breite anzeigen zu lassen max aber nur 350 px das bild ...

Visual Studio
VB.Net - Datagridview Objekt Update
gelöst Frage von PatrickB90Visual Studio1 Kommentar

Guten Morgen zusammen, als neu Einsteiger im Bereich VB.Net steh ich grade vor einem Problem. In einer Form wurde ...

Windows 10

RuntimeError429ActiveXCompomentcan not create Objekt

Frage von Fitzel69Windows 102 Kommentare

Hallo zusammen Anbei folgende Information Ich habe ein Laptop mit Windows 10 64 bit neu installiert. Office 2016 + ...

Windows Server

Letzte User Objekt Modifizierungen anzeigen lassen

Frage von agnostikerWindows Server1 Kommentar

Hi, wie kann ich mir Anzeigen lassen, welche User Objekt Attribute modifiziert wurden, wenn moeglich noch von wem / ...

Neue Wissensbeiträge
Off Topic
Was als Noob hier mal gesagt werden musste
Information von th30ther vor 1 TagOff Topic2 Kommentare

Moinsen wertes Forum, ich möchte mich an dieser Stelle mal beim Forum generell und bei aqui speziell bedanken! Ich ...

Windows 10
Windows 10 Mai 2019 Update (Version 1903) ist da
Information von kgborn vor 1 TagWindows 105 Kommentare

Nur ein kurzer Infosplitter: Microsoft hat die Nacht (21. Mai 2019) das Funktionsupdate auf Windows 10 Version 1903 freigegeben. ...

E-Mail

Newsletter: Unread News - IT News in Byte Länge

Tipp von franktaylor vor 2 TagenE-Mail11 Kommentare

Hallo, würde gerne auf einen Newsletter hinweisen, den ich heute per Zufall gefunden und mit euch gerne teilen möchte: ...

Outlook & Mail

Outlook 2016 stürzt ab, wenn man ein (at)- Zeichen im Text einer neuen E-Mail schreibt

Tipp von Enriqe vor 2 TagenOutlook & Mail4 Kommentare

Bei uns in der Firma häuften sich die Fälle, bei denen sich Outlook kommentarlos verabschiedet, wenn man ein - ...

Heiß diskutierte Inhalte
Hyper-V
Novell virtualisieren
Frage von spoboeHyper-V21 Kommentare

Hallo zusammen, ich habe absolut keine Ahnung von Novell, aber wir haben hier ein ganz altes Schätzchen (vermutlich Novell ...

Windows Server
Ungewollte IP Änderung am DC sorgt für Probleme
Frage von thomas-99Windows Server19 Kommentare

Hallo Zusammen, wir haben ein kleines Netz mit 5 verschiedenen VMs (DC, AD, Fileserver, Exchange, TK Anlage - alle ...

Netzwerkmanagement
Gateprotect Firewall - Internetseiten werden teilw. nicht geladen
Frage von KivasFNetzwerkmanagement16 Kommentare

Morgen Zusammen, ich habe ein Problem mit einer Gateprotect Firewall welches mir echt Kopfschmerzen bereitet. Die Firewall hängt an ...

Router & Routing
HP 2920 als Router konfigurieren. Bitte um Unterstützung
gelöst Frage von suedi123Router & Routing16 Kommentare

Liebe Forumsmitglieder, ich habe hier ein Problem, bei welchem ich nicht weiterkomme, weil ich mich zu wenig mit der ...