Erweiterte Programmierung


Mit speicherbaren Eigenschaften können Sie sicherstellen, dass nach einem unerwarteten Programmabsturz oder dem reguläreren Beenden des iPlus-Dienstes der Zustand nach dem erneuten Starten des Dienstes wiederhergestellt wird.

Damit eine Eigenschaft speicherfähig (persistierbar) ist müssen Sie die Eigenschaft IsPersistable der verschiedenen ACPropertyBase-Attributklassen auf True setzen.

Der Speichervorgang erfolgt unmittelbar (asynchron) während des Aufrufs der setter-Methode (indem die OnPropertyChanged()-Methode aufgerufen wird) oder bei der Änderung der ValueT-Eigenschaft von netzwerkfähigen Eigenschaften.

Umgekehrt erfolgt die Wiederherstellung dadurch, dass das iPlus-Framework beim Hochfahren die setter-Methode einmalig mit dem Wert aufruft, der zuletzt in der Datenbank gespeichert worden ist.

Technisch gesehen erfolgt beim Schreiben oder Lesen immer eine Serialisierung- oder Deserialisierung mittels des DataContractSerializers. Der serialisierte String wird in der Eigenschaft XMLValue der Tabelle ACClassTaskValue gespeichert. Deswegen können nur Datentypen gespeichert werden, die dem DataContractSerializer zuvor bekannt gemacht worden sind:


Zur Serialisierung verwendet iPlus den DataContractSerializer von .NET. Der DataContractSerializer wird nicht nur zur Persisitierung der Eigenschaften verwendet sondern auch für die Netzwerkübertragung (Client/Server). In beiden Fällen müssen alle Typen dem DataContractSerializer in der KnownTypes Eigenschaft bekannt gegeben werden die gespeichert bzw. über das Netzwerk übertragen werden sollen.

Das iPlus-Framework vereinfacht dies jedoch für Sie, indem Sie die Attributklasse ACSerializeableInfo verwenden. Diese deklarieren vor einer ACComponent-Klasse wo sie diese serialisierbaren Typen benötigen:

[ACSerializeableInfo(new Type[] { typeof(ACMaintWarning), typeof(List<ACMaintWarning>), typeof(List<ACMaintDetailsWarning>) })]

Beispiel für Smart-Pointer:

[ACSerializeableInfo(new Type[] { typeof(ACRef<Weighing>) })]

Zudem müssen Sie den Typen mit den DataContract- und DataMember-Attributklassen beschreiben wie es die WCF vorgibt.

 


Achtung: Vermeiden Sie dies bei Entity-Objekten! Entitätsobjekte sollten manuell gelesen und geschrieben werden, indem Sie Ihren eigenen ObjectContext oder DatabaseContext verwenden. Lesen Sie mehr dazu im Abschnitt "Datenbank-Kontexte und Entity Framework".