Skip to content

WCF: “Slicing” objects on serialization

David Turner asks in a comment on the blog post Polymorphism in WCF contracts if it’s possible to deliberately “slice” an instance of the derived type. Instead of passing an instance of a base type to a method he wants to pass an instance of a derived type. When the instance is send to the server he only wants the part (members) of the base type to be serialized. So he asks:

How do I instruct it to just serialize the base?

Ok, here is how you can accomplish this:

Continued…

Categories: Programming.

Tags: , ,

Double-Checked Locking in C#

Heute hatte ich eher zufällig das Buch Head First Design Patterns in der Hand. Auch eher zufällig bin ich dabei im Kapitel über das Singleton-Pattern beim Double-Checked Locking hängen geblieben. Dort wird darauf aufmerksam gemacht, dass dieses Pattern unter Java 1.4 und früheren Versionen nicht funktioniert.
Da ich dieses Pattern bereits einige male in C# verwendet habe, wurde ich doch etwas neugierig und habe ein bischen nach den Gründen dafür gesucht. Dabei bin ich auf den Artikel The "Double-Checked Locking is Broken" Declaration aufmerksam geworden. In diesem werden alle Probleme mit diesem Pattern detailiert erläutert.

Mein C#-Code für dieses Pattern sah bis jetzt immer folgendermaßen aus (stark abstrahiert):

C#:
  1. public sealed class Singleton
  2. {
  3.     private static Singleton instance = null;
  4.     private static object syncRoot = new object();
  5.     public string value;
  6.  
  7.     private Singleton()
  8.     {
  9.         value = "test123";
  10.     }
  11.  
  12.     public static Singleton Instance
  13.     {
  14.         get
  15.         {
  16.             if (null == instance) // first check
  17.             {
  18.                 lock (syncRoot)
  19.                 {
  20.                     if (null == instance) // second (double) check
  21.                         instance = new Singleton();
  22.                 }
  23.             }
  24.             return instance;
  25.         }
  26.     }
  27. }

Stellt sich die Frage, ob mit diesem Code in C# bzw. unter .Net auch Probleme bestehen.
Continued...

Categories: Programming.

Tags: , , ,

Getting paid for drinking Beer

Bei meinem täglichen Streifzug durchs Netz habe ich gerade mehr oder weniger zufällig einen kleinen Zwischenstopp auf der Website des 24C3 gemacht. Beim durchstöbern der diesjährigen Events, bin ich auf den Beitrag mit dem Titel Toying with barcodes - Jemandem einen Strich auf die Rechnung machen gestoßen, der sich mit Barcodes beschäftigte.

FX von Phenoelit beschreibt dort unter anderem wie man mit diesen kleinen Strichcodes so manche lustige Sache machen kann. Die Dinger sind ja auch überall zu finden, auf Briefen, Bahntickets, Parkkarten, Pfandbongs ...

Sehr amüsant fand ich die Idee sich für seinen Bierkonsum bezahlen zu lassen. Wie das funktioniert wird im Video zum Beitrag erklärt.

Leider hat das ganze auch weniger spassige Seiten, wenn es z.B. um das Unterschieben von Gepäckstücken bei Flugzeugreisen geht. In dem Beitrag wird nämlich auch darauf hingewiesen, dass es evtl. möglich sein könnte (... and I hope for our ass it doesn't!) Passagieren Gepäck unterzuschieben.

Categories: Fun, Real Life, Security.

Tags: , , ,

Interfaces und abstrakte Klassen als Parameter – Teil 3

Die Lösung für ein Problem bin ich noch schuldig geblieben. Die beim letzten mal vorgestellte Lösung hatte den Nachteil, dass ein wichtiges Prinzip der Serviceorientierung nicht eingehalten wurde - Services share schema and contract, not class.

Die Lösung hierfür ist es die möglichen ServiceKnownTypes erst zur Laufzeit zu bestimmen. Folgendes Beispiel erläutert, wie es funktioniert:
Continued...

Categories: Programming, Web.

Tags: , , , ,

Interfaces und abstrakte Klassen als Parameter – Teil 2

Gestern habe ich im ersten Teil ein Problem geschildert, das auftritt, wenn man versucht Polymorphismus im Zusammenhang mit WCF-Services einzusetzen. Dabei ging es konkret darum Interfaces oder abstrakte Klassen als Parameter an Service-Methoden zu übergeben.

Die vorgestellte Lösung für das Problem mittels des ServiceKnownType-Attributs hatte den Nachteil, dass "echter" Polymorphismus nicht unterstützt wurde und somit ein weiteres Problem geschaffen war bzw. das eigentlich Problem nicht richtig gelöst war.

Um in unserem Beispiel "echten" Polymorphismus zu unterstützen, muss es möglich sein, beliebige Instanzen von Klassen an den Service zu übermitteln, die entweder das Interface ICustomer implementieren oder von der abstrakten Klasse CustomerBase abgeleitet sind. Möglich ist dies durch den Einsatz des NetDataContractSerializers. Wie das im Detail funktioniert beschreibt Aaron Skonnard in seinem Blogeintrag WCF's NetDataContractSerializer.
Mit Hilfe des dort vorgestellten NetDataContractFormat-Attributs sieht die Beschreibung unseres Service somit folgendermaßen aus:

C#:
  1. [ServiceContract]
  2. public interface ICustomerService
  3. {
  4.     [OperationContract]
  5.     [NetDataContractFormat]
  6.     void AddCustomerInterface(ICustomer customer);
  7.  
  8.     [OperationContract]
  9.     [NetDataContractFormat]
  10.     void AddCustomerBase(CustomerBase customer);
  11. }

OK, alles ist super. Polymorphismus wird unterstützt und wir sind glücklich.

Naja, leider nicht wirklich ...
Continued...

Categories: Programming, Web.

Tags: , , , , ,