Kleine Fallstricke der Serialisierung

Eine Klasse soll als Ergebnis eines guten alten ASMX basierten SOAP Web Service von einem Server an einen Client gesendet werden. Die Klasse hat neben den Eigenschaften, die den Client etwas angehen, auch noch interne Strukturen, die für die Verarbeitung genutzt werden. Diese werden geeignet markiert, etwa so:

[Serializable, XmlType("Test")] public class Item
{
[XmlAttribute("id")] public string UniqueName { get; set; }
[XmlIgnore] public Context State { get; set; }
}

Hier werden automatische Felder (auto-implemented properties) benutzt, i.e. zu den deklarierten .NET Eigenschaften UniqueName und State gibt es für den Entwickler unsichtbar zugehörige .NET Felder der Klasse. Was aber, wenn die Serveranwendung tatsächlich aus mehreren AppDomains besteht, zwischen denen Instanzen der Klasse ebenso ausgetauscht werden sollen – typisch ist ein (ASP.NET) Hosting Szenario, wobei die eigentlichen Serveralgorithmen in einer AppDomain mit kontrolliertem Lebenszyklus (etwa einem Windows Dienst) implementiert sind und eine oder mehrere andere AppDomains die Kommunikation mit dem Client regeln und etwa dynamisch bei Veränderungen nachgeladen werden (etwa durch die ASP.NET Dateiüberwachung).

Die hier verwendete SOAP Serialisierung zum Client verwendet die XML Serialisierung. Diese berücksichtigt ausschließlich öffentliche (public) .NET Eigenschaften, das Ausschließen einzelner Eigenschaften geschieht wie im Beispiel durch das XmlIgnoreAttribute. Zwischen AppDomains wird allerdings die binäre Serialisierung verwenden (Kann man das wählen? Ich habe nichts dazu gefunden.), die sich an .NET Feldern und dem NonSerializedAttribute orientiert. Konkret heißt das im Beispiel, dass zwischen AppDomains beide Eigenschaften ausgetauscht werden.

Das kann natürlich so gewollt sein, keine Frage. Aber dann wäre im Beispiel der Context auch entweder serialisierbar oder ein MarshalByRefObject. Passiert es ungewollt, so kann das je nach Situation einen empfindlichen Einfluss auf die Laufzeiten haben, da mit kleinen Instanzen eventuell sehr große angehängte Objekte stillschweigend mit serialisiert werden oder unerwartete AppDomain kreuzende Aufrufe vorgenommen werden. Leider hat Microsoft aber wohl den einfachen Weg nicht implementiert, der für event Felder prima funktioniert:

[XmlIgnore][field:NonSerialized] public Context State { get; set; }

Daher ist es notwendig, auf die automatischen Eigenschaften zu verzichten und selbst ein Feld anzulegen. Nicht tragisch, aber auch nicht elegant.

[NonSerialized] private Context m_State;
[XmlIgnore] public Context State { get { return m_State; } set { m_State = value; } }

DVB.NET hat in der Klasse SourceSelection ein weiteres Problem: hier sollen Eigenschaften, die auf Objekte verweisen, als Zeichenkette serialisiert werden, wobei diese durch eindeutige Namen der Objekte zusammengesetzt werden. Dabei kommt man leider um ISerializable und Konsorten nicht herum, wenn man die binäre Serialisierung genauso nutzen möchte wie die XML Serialisierung – egal ob explizit oder wie beschrieben implizit durch AppDomain Grenzen bedingt.

Happy Coding

Jochen

VCR.NET 3.9 Verluste: Aktualisierung der Version

Bisher habe ich mir immer sehr viel Mühe gegeben, dass bei einer aktualisierenden Installation (Deinstallation einer älteren Version und Installation der jeweils aktuellsten) der VCR.NET Recording Service sofort wieder einsetzbar ist. Das betrifft sowohl die Konfiguration als auch den Aufzeichnungsplan. Für 3.9 wird es einen Abstrich geben, der aber vermutlich kaum jemanden betrifft: erfolgt die Aktualisierung von einer Version vor 2.7 (ja, vor dem Punkt steht eine 2 und keine 3), so geht der Aufzeichnungsplan verloren. Die Konfiguration bleibt erhalten. Hintergrund ist, dass bis zur 2.6 die Aufzeichnungspläne als SOAP serialisierte XML Dateien gespeichert wurden und ab 2.7 ein neues Format verwendet wurde. VCR.NET hat beim ersten Starten automatisch eine verlustfreie Konvertierung vorgenommen. Mit 3.9 wurde das neue Format leicht modifiziert, um einige der Möglichkeiten der nächsten DVB.NET Generation schon einmal verfügbar zu machen. Auch hier gibt es wieder eine automatische Konvertierung, allerdings nur von dem 2.7er Format an – die doppelte Konvertierung wäre möglich, rechtfertigt sich aber nicht, da 2.6 einfach zu alt ist.

Wer denn dann wirklich eine 2.6 betreibt und unbedingt auf die 3.9 will: erst einmal irgendeine Zwischenversion installieren, VCR.NET einmal durchstarten und dann die Zwischenversion wieder deinstallieren. Das Durchstarten übernimmt den ersten Konvertierungsschritt.

Sollte es tatsächlich jemanden betreffen und Mühe machen: sorry!

Für die meisten anderen Anwender einfach zum Lesen und sofortigen Vergessen 🙂

Jochen

VCR.NET 3.9 Verluste: Optionsdienste (Services) von PREMIERE

Bisher war es möglich, einen Service (NVOD Film bei PREMIERE Direkt oder einen Sportkanal von PREMIERE SPORT) dadurch aufzuzeichnen, dass man eine Aufzeichnung auf dem zugehörigen Portal definierte und dann die NVOD Kennung spezifizierte – einfach wie Golf bei Sport, kryptisch wie D2-20:15 bei den Filmen. VCR.NET startet dann die Aufzeichnung auf dem Portal und beobachtete die Serviceinformationen, die in der elektronischen Programmzeitschrift mit übertragen wurden. Sobald der gewünschte Service verfügbar war, wurde die Aufzeichnung auf dem Portal beendet und auf für den Service neu gestartet.

Dieses Feature gibt es mit VCR.NET 3.9 gar nicht mehr. Zum einen glaube ich kaum, dass es produktiv genutzt wurde. Zum anderen bietet VCR.NET heute schon die Möglichkeit, die Programmzeitschrift der Dienste auszulesen und direkt eine Aufzeichnung auf dem entsprechenden Dienstkanal zu programmieren – natürlich geht das auch manuell, wenn man die Nummer des Dienstes kennt.

Bei der Konvertierung der Aufzeichnungsaufträge aus einer Vorgängerversion werden diese Daten erst einmal übernommen – die Konvertierung nimmt VCR.NET 3.9 beim ersten Starten automatisch vor. Allerdings werden diese Aufträge nicht bei der Planung berücksichtigt – ich habe die Absicht, diese wie Aufzeichnungen mit nicht mehr bekannten Sendern durch ein ? in der Oberfläche zu kennzeichnen, aber so weit ist 3.9 nach lange nicht.

Sollte sich tatsächlich jemand melden, der das Feature benutzt, werde ich das Ganze noch einmal überdenke. Bis dahin gehe ich von R.I.P. aus.

Jochen

VCR.NET 3.9 Verluste: Das Kreuz mit der Nexus

Dies ist der erste Artikel zum aktuellen Entwicklungsstand der nächsten Version 3.9 des VCR.NET Recording Service. Er wird vollständig auf den neuen Philosophien von DVB.NET 3.9 basieren und sowohl zu DVB.NET 3.9 / 4.0 als auch den veränderten Konzepten habe ich ja schon einiges beschrieben. Aus Platzgründen verzichte ich daher bei den VCR.NET 3.9 Artikeln darauf, alle Ideen und Vorstellung noch einmal zu erläutern. Allerdings haben einige der Veränderungen durchaus Auswirkungen auf den Betrieb von VCR.NET.

VCR.NET 3.9 wird in den Sendertabellen keine Detailinformationen zu den einzelnen Quellen mehr vermerken, etwa welche Tonspuren zum Zeitpunkt des letzten Sendersuchlauf präsent waren. Diese Informationen verändern sich bei einigen Sendern teilweise von Sendung zu Sendung (etwa Dolby Digital oder DVB Untertitel), so dass ein Eintrag in die Sendertabelle mehr ein Hinweis denn eine nützliche Information wäre. Die altbekannten Einstellungen ‘alle Sprachen’, ‘Dolby Digital’, ‘Videotext’ und ‘DVB Untertitel’ verstehen sich nun als Wünsche der Art: wenn die entsprechende Datenspur angeboten werden sollte, dann zeichne sie bitte mit auf.

Die meiste verfügbare DVB Hardware hat keine Einschränkung bezüglich der Anzahl der Datenströme, die gleichzeitig aufgezeichnet werden können. Den Wünschen kann daher in allen Fällen entsprochen werden. Die einzige Veränderung gegenüber früher ist, dass VCR.NET Änderungen an der Senderkonfiguration erkennt (Tonspuren werden hinzugeschaltet) und in diesen Fällen eine neue Aufzeichnungsdatei beginnt – wie bereits in der aktuellen Version etwa für die Lokalfenster vom WDR. Es muss sich zeigen, ob dieser Ansatz vernünftig ist – was, wenn ein Sender etwa mitten im Film eine Tonspur zuschaltet? Der Bruch der Dateien bedeutet dann ziemlich sicher auch einen Datenverlust.

Ganz anders sieht es aber bei Hardware aus, die von Natur aus nur eine begrenzte Anzahl von Datenströmen aufzeichnen kann. Insbesondere geht es hier um die Hauppauge Nexus / TechnoTrend Premium Line, für die DVB.NET und VCR.NET vor jetzt fast 6 Jahren einmal entwicklet wurden.

Bevor wir zu dem beschriebenen Effekt kommen, erst einmal etwas zu einem anderen Aspekt, der aber auf die selbe Art behandelt wird: den so genannten Mehrkanalaufzeichnungen. Hierbei werden mehrere Sender von einer Quellgruppe (früher Transponder genannt) gleichzeitig aufgezeichnet. Mit der Beschränkung der Nexus auf 8 Datenströme könnten somit etwa maximal vier Fernsehsender ohne Goodies (alternative Sprachen, …) gleichzeitg aufgezeichnet werden. Das Problem für VCR.NET ist nun die Planung der Aufzeichnungen und die Berücksichtigung dieser Beschränkungen: früher wurde auf Basis der scheinbar vollständigen Daten in der Senderliste geplant, also wenn ich nun einen Radiosender aufzeichne, der mit einer Stereo- und einer Dolbytonspur eingetragen ist, so wurden dafür zwei Datenströme reserviert, wenn der Wunsch ‘Dolby Digital’ aktiviert wurde. Die Aufzeichnung versuchte dann auch stur nach der Senderliste die Datenspuren aufzuzeichnen – egal ob mit Daten beschickt oder nicht. Das konnte die Synchronisation der Aufzeichnungsdateien ganz schön durcheinanderbringen.

VCR.NET 3.9 plant nun ausschließlich auf folgender Basis: ein Fernsehsender benötigt mindestens zwei, ein Radiosender mindestens einen Datenstrom. Bei der Planung können so vielen Sender gleichzeitig aufgezeichnet werden, wie diese Minimalsumme kleiner als 8 ist. Beim Starten der Aufzeichnung prüft VCR.NET (genauer: der verwendete DVB.NET Card Server), ob die tatsächliche aktuelle Konfiguration der Sender die Berücksichtigung aller Wünsche erlaubt. Ist das nicht der Fall, so werden die Wünsche nach einer internen Priorisierung verworfen – zuerst DVB Untertitel, etc. Würde man etwa ZDF und 3Sat parallel aufzeichnen wollen und alle Wünsche aktivieren (Bild und Standardton sowie alternative Sprachen (Zweikanal), Dolby Digital, Videotext und DVB Untertitel – das macht 6 Datenströme pro Sender), so wird VCR.NET jedem Sender 4 Datenströme zuteilen und in der aktuellen Implementierung die DVB Untertitel und Dolby Digital weglassen. Es wird sich zeigen, in welcher Form dieser Mechanismus dann in 4.0 landen wird – vorstellen kann man sich vieles an individueller Konfiguration. Für mich muss ich einfach den Aufwand gegen den Nutzen betrachten – wie oft gibt es durch den vorhandenen Algorithmus eine Situation, die vorher nicht erkannt wird und zu einem unbefriedigenden Aufzeichnungsergebnis führt? Ausdenken kann man sich vieles, es zählt nur die Realität.

Mit dem Ändern der Senderdaten ist es im Prinzip genau so. Wenn eine Änderung erkannt wird, stoppt VCR.NET die Aufzeichnung erst einmal. Danach wird auf Basis der ursprünglichen Wünsche eine neue Aufzeichnungskonfiguration ermittelt, die gemäß den noch verfügbaren Datenströmen ausgeführt werden kann und die Aufzeichnung darauf basierend neu gestartet. Wenn aus einem Radiosender nicht plötzlich ein Fernsehsender wird ist sichergestellt, dass zumindest die Minimalanforderung einmal Ton plus Bild (für Fernsehsender) erfüllt werden kann und die Aufzeichnung weiter geht. Lustiger wird das natürlich, wenn bei einer Mehrkanalaufzeichnung mehrere Sender mehrfach ihre Daten ändern – das ist aber eher selten. Tasächlich existent ist aber das Problem, dass einige Sender Datenströme gemeinsam nutzen – etwa die WDR Regionalsender den Videotext in den Regionalfenstern. In extremen Fällen kann es hier zu einer Fehlplanung kommen, ich denke aber, dass ich alle nicht manipulierten normalen Situationen im Griff habe.

Lange Rede kurzer Sinn: hat man eine Nexus, so sind ab sofort die Zusatzeinstellungen als Wünsche zu betrachten. Bei Mehrkanalaufzeichnungen oder der Aufzeichnung extremer Sender (Euronews mit Bild und 8 Tonspuren) muss man im Laufe der Zeit ein gewissen Gefühl für Problemsituationen entwickeln. So ist es leider – ich bin auch noch Nexus Anwender und bleibe da selbst am Ball. Auf der anderen Seite sollte es nun ohne aufwändige Manipulation der Senderlisten möglich sein, insbesondere auch Sender mit optionalen Tonspuren (Englisch bei Premiere, Dolby bei ARD Radiosendern, …) ohne weiter nachzudenken vollständig aufzuzeichnen.

So, dass muss erst mal reichen!

Jochen