Hallo zusammen,
vielleicht hat ja Jemand von euch eine Idee. Folgende Situation.
Ich habe eine Klassenbibliothek, die mir verschiedene Objekte anbietet. In diesem Fall jetzt z.B. ein Objekt Aufgabe.
Hier stark vereinfacht mit einer EIgenschaft:
Das Objekt kann serialisiert werden und wird als Base64 serialisiert. Hier die entsprechende Klasse die das erledigt:
Nun habe ich folgendes Problem. Die Library wird sowohl vom Client, als auch Server benutzt. Diese tauschen die Objekte miteinander aus. Nun soll der Server aber nicht abstürzen, wenn der Client eine neuere DLL Version verwendet, welche weitere Eigenschaften in der Klasse Aufgabe hat. Beispiel:
Gibt es eine Möglichkeit, wie ich es dennoch hinbekomme, dass der Server das Objekt deserialisieren kann? Der Sinn dahinter soll sein, dass Clients mit unterschiedlicher Version sich dennoch verbinden können. Der Server würde dann halt nur die neue Eigenschaft nicht verwenden, da er diese noch nicht kennt.
Viele Grüße,
Marvin
vielleicht hat ja Jemand von euch eine Idee. Folgende Situation.
Ich habe eine Klassenbibliothek, die mir verschiedene Objekte anbietet. In diesem Fall jetzt z.B. ein Objekt Aufgabe.
Hier stark vereinfacht mit einer EIgenschaft:
Das Objekt kann serialisiert werden und wird als Base64 serialisiert. Hier die entsprechende Klasse die das erledigt:
C#-Quellcode
- public static class NachrichtenSerializer
- {
- /// <summary>
- /// Serialisiert ein Object - macht also einen Base64 Kodierten String raus. Dabei sind die Zeichen sicher - Umlaute etc. geschützt.
- /// </summary>
- /// <param name="o"></param>
- /// <returns></returns>
- public static string SerializeObject(object o)
- {
- if (!o.GetType().IsSerializable)
- {
- return null;
- }
- /*
- * Wir konvertieren die Bytes des strings zu Base64, da wir dadurch keine Probleme bei der Darstellung von Sonderzeichen erhalten
- * Ferner können wir so auch Dateien einfach übertragen
- * Weitere Informationen:
- * https://de.wikipedia.org/wiki/Base64
- * https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6a546be8-f36f-4cce-a061-4200e4685400/how-to-send-base64-string-to-my-server?forum=netfxbcl
- */
- using (MemoryStream stream = new MemoryStream())
- {
- new BinaryFormatter().Serialize(stream, o);
- return Convert.ToBase64String(stream.ToArray());
- }
- }
- /// <summary>
- /// Deserialisiert den empfangen Base64 String
- /// </summary>
- /// <param name="str">Der empfangen Base64 String</param>
- /// <returns></returns>
- public static object DeserializeObject(string str)
- {
- byte[] bytes = Convert.FromBase64String(str);
- object ReturnObject; //Da die Klasse generisch ist, müssen wir ein Objekt zurück geben
- using (MemoryStream stream = new MemoryStream(bytes))
- {
- BinaryFormatter formatter = new BinaryFormatter();
- ReturnObject = formatter.Deserialize(stream);
- return ReturnObject;
- }
- }
- }
Nun habe ich folgendes Problem. Die Library wird sowohl vom Client, als auch Server benutzt. Diese tauschen die Objekte miteinander aus. Nun soll der Server aber nicht abstürzen, wenn der Client eine neuere DLL Version verwendet, welche weitere Eigenschaften in der Klasse Aufgabe hat. Beispiel:
Gibt es eine Möglichkeit, wie ich es dennoch hinbekomme, dass der Server das Objekt deserialisieren kann? Der Sinn dahinter soll sein, dass Clients mit unterschiedlicher Version sich dennoch verbinden können. Der Server würde dann halt nur die neue Eigenschaft nicht verwenden, da er diese noch nicht kennt.
Viele Grüße,
Marvin