Automatische Serialisierung und ISerializable kombinieren



  • Nehmen wir an, ich habe eine Klasse mit lauter Attributen, die serialisierbar sind und nur ein Attribut ist nicht serialisierbar:

    [Serializable]
    class Test
    {
        string Name;
        decimal Geld;
    
        [NonSerialized]
        NichtSerialisierbaresObjekt X;
    }
    

    Nun möchte ich in Test gerne die ID von NichtSerialisierbaresObjekt serialisieren, um das Objekt daran wieder herzustellen:

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("X.ID", X.ID);
    }
    
    Test(SerializationInfo info, StreamingContext context)
    {
        X = new NichtSerialisierbaresObjekt(info.GetInt32("X.ID"));
    }
    

    Das Problem ist jetzt leider: Sobald ich einmal sowas machen will, muss ich auch alle anderen meiner Variablen manuell serialisieren, was ja ohne Interfaceimplementierung automatisch gemacht worden wäre:

    void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("X.ID", X.ID);
    
        // Nervig und fehleranfällig:
        info.AddValue("Name", Name);
        info.AddValue("Geld", Geld);
    }
    
    Test(SerializationInfo info, StreamingContext context)
    {
        X = new NichtSerialisierbaresObjekt(info.GetInt32("X.ID"));
    
        // Nervig und fehleranfällig:
        Name = info.GetString("Name");
        Geld = info.GetDecimal("Geld");
    
    }
    

    Kann man es so einstellen, dass er die Standardserialisierung durchführt (also die, die er macht, wenn man nur [Serializable] deklariert, aber nicht ISerializable implementiert) plus die selbst definierte Serialisierung macht? So dass ich meine normalen Datentypen komplett aus GetObjectData rauslasse und dort nur die ID verabreite, während die Standardserialisierung (die, die nichts mit dem Interface zu tun hat) sich um meine normalen Variablen kümmert?



  • Du könntest NichtSerialisierbaresObjekt Serializable machen und dort alle Member ausser Id Nonserialized. Es gibt m.E. Events beim Deserialisieren wo du dich dranhängen kannst und dann NichtSerialisierbaresObjekt selber aus der Id aufbauen kannst.



  • witte schrieb:

    Du könntest NichtSerialisierbaresObjekt Serializable machen und dort alle Member ausser Id Nonserialized.

    NichtSerialisierbaresObjekt musst du als Blackbox betrachten. Das ist also quasi eine Klasse, die ich nicht verändern kann.



  • [Serializable]
    class Test
    {
    string Name;
    decimal Geld;

    [NonSerialized]
    NichtSerialisierbaresObjekt X;

    public string X_Id
    {
    get { return X.Id; }
    set { X = new X(value); }
    }
    }

    Ist zwar etwas gefrickel, aber wäre das eine Lösung? Wie genau du X jetzt natürlich wiederherstellst, weiß ich nicht, aber vom Prinzip her könnte es so gehen.



  • Properties (mit Ausnahme von Auto-Properties) werden nicht serialisiert, weil es letztendlich nur Funktionen sind. Also wird das nicht gehen.


Anmelden zum Antworten