Deserialisierung eines Objekts einer neueren Version

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Deserialisierung eines Objekts einer neueren Version

    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:

    C#-Quellcode

    1. [Serializable]
    2. public class Aufgabe
    3. {
    4. /// <summary>Ruft die eindeutige ID der Aufgabe ab.</summary>
    5. public long A_NR { get; protected internal set; } = 0;
    6. }


    Das Objekt kann serialisiert werden und wird als Base64 serialisiert. Hier die entsprechende Klasse die das erledigt:

    C#-Quellcode

    1. public static class NachrichtenSerializer
    2. {
    3. /// <summary>
    4. /// Serialisiert ein Object - macht also einen Base64 Kodierten String raus. Dabei sind die Zeichen sicher - Umlaute etc. geschützt.
    5. /// </summary>
    6. /// <param name="o"></param>
    7. /// <returns></returns>
    8. public static string SerializeObject(object o)
    9. {
    10. if (!o.GetType().IsSerializable)
    11. {
    12. return null;
    13. }
    14. /*
    15. * Wir konvertieren die Bytes des strings zu Base64, da wir dadurch keine Probleme bei der Darstellung von Sonderzeichen erhalten
    16. * Ferner können wir so auch Dateien einfach übertragen
    17. * Weitere Informationen:
    18. * https://de.wikipedia.org/wiki/Base64
    19. * https://social.msdn.microsoft.com/Forums/sqlserver/en-US/6a546be8-f36f-4cce-a061-4200e4685400/how-to-send-base64-string-to-my-server?forum=netfxbcl
    20. */
    21. using (MemoryStream stream = new MemoryStream())
    22. {
    23. new BinaryFormatter().Serialize(stream, o);
    24. return Convert.ToBase64String(stream.ToArray());
    25. }
    26. }
    27. /// <summary>
    28. /// Deserialisiert den empfangen Base64 String
    29. /// </summary>
    30. /// <param name="str">Der empfangen Base64 String</param>
    31. /// <returns></returns>
    32. public static object DeserializeObject(string str)
    33. {
    34. byte[] bytes = Convert.FromBase64String(str);
    35. object ReturnObject; //Da die Klasse generisch ist, müssen wir ein Objekt zurück geben
    36. using (MemoryStream stream = new MemoryStream(bytes))
    37. {
    38. BinaryFormatter formatter = new BinaryFormatter();
    39. ReturnObject = formatter.Deserialize(stream);
    40. return ReturnObject;
    41. }
    42. }
    43. }


    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:

    C#-Quellcode

    1. [Serializable]
    2. public class Aufgabe
    3. {
    4. /// <summary>Ruft die eindeutige ID der Aufgabe ab.</summary>
    5. public long A_NR { get; protected internal set; } = 0;
    6. public string TITEL { get; set; } = String.Empty;
    7. }


    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