2010-12-29 14 views
1

Eine meiner WCF-Funktionen gibt ein Objekt zurück, das eine Elementvariable eines Typs aus einer anderen Bibliothek enthält, die sich meiner Kontrolle entzieht. Ich kann die Klassen dieser Bibliothek nicht dekorieren. Tatsächlich kann ich DataContractSurrogate nicht einmal verwenden, da die Klassen der Bibliothek private Membervariablen haben, die für den Betrieb wesentlich sind (d. H. Wenn ich das Objekt ohne diese privaten Membervariablen zurückgebe, werfen die öffentlichen Eigenschaften Ausnahmen).WCF - Rückgabeobjekt ohne Serialisierung?

Wenn ich sage, dass die Interoperabilität für diese bestimmte Methode nicht benötigt wird (zumindest bis die Besitzer dieser Bibliothek revidieren können, um ihre Objekte serialisierbar zu machen), ist es möglich, WCF zu verwenden, um dieses Objekt so zurückzugeben zumindest von einem .NET-Client verbraucht werden?

Wie gehe ich dabei vor?

Update: Ich füge Pseudo-Code unten ...

// My code, I have control 

[DataContract] 
public class MyObject 
{ 
    private TheirObject theirObject; 

    [DataMember] 
    public int SomeNumber 
    { 
    get { return theirObject.SomeNumber; } // public property exposed 
    private set { } 
    } 
} 

// Their code, I have no control 

public class TheirObject 
{ 
    private TheirOtherObject theirOtherObject; 

    public int SomeNumber 
    { 
    get { return theirOtherObject.SomeOtherProperty; } 
    set { // ... } 
    } 
} 

Ich habe versucht Datamember zu meinem Beispiel ihrer Aufgabe hinzufügen, es öffentlich zu machen, eine DataContractSurrogate verwenden und auch das Objekt manuell Streaming. In allen Fällen bekomme ich einen Fehler, der schließlich dazu führt, dass ihr Objekt nicht explizit serialisiert werden kann.

+0

Haben Sie die binäre Serialisierung untersucht? –

+0

@Sergei: Ich habe versucht, manuell Serialisierung in binäre Verwendung von BinaryFormatter aber eine Objekt nicht serialisierbare Ausnahme. Glauben Sie, dass die binäre Serialisierung von WCF bei diesem Fehler besser funktioniert? – Mayo

Antwort

2

Sicher, eine Wrapper-Klasse schreiben, die alle die gleichen öffentlichen Eigenschaften verfügbar und einfach gesagt "get { return internalObject.ThisProperty; } hat. Die Wrapper-Klasse Verzieren, so dass es mit WCF funktioniert.

+0

Aber die Kindeigenschaften, die er benutzt, sind immer noch versteckt und sind immer noch nicht serialisierbar, und ich glaube nicht, dass es einen Weg gibt ... – veljkoz

+0

@veljkoz: aber da er das reale Objekt nicht serialisieren kann, kann er ' t sende das reale Objekt. Er muss genügend Informationen senden, damit auf der anderen Seite eine Kopie des "echten" Objekts erstellt werden kann. Das erfordert wahrscheinlich nicht das Senden der privaten Felder. –

+0

@ John/vel/Chris: Ich denke, dass dieser Ansatz normalerweise funktionieren würde (und es ist eine Art von was ich jetzt tue), aber der Zustand ihres Objekts muss erhalten werden, weil dieses Objekt eine Methode hat, gegen die sich einiges ernsthaft anhebt die privaten Mitglieder. Ich habe eine Problemumgehung gefunden, bei der ich das Objekt mit serialisierbaren Daten neu initialisieren konnte (d. H. Ich hatte Glück), aber ich denke, dass es nicht möglich ist, ein Objekt mit privaten/unserialisierbaren Abhängigkeiten zu serialisieren. – Mayo

0

Eine andere Möglichkeit ist es, eine Proxy-Klasse, die Spiegel zu schreiben die Eigenschaften des Typs wünschen Sie genau zu verwenden, und zurück, dass über WCF.

Sie AutoMapper das Proxy-Objekt füllen verwenden kann.

Dieser Ansatz hat den Vorteil, dass Sie da die Verbraucher nicht nehmen eine Abhängigkeit von der Third-Party-Bibliothek, wenn versucht wird, sie zu verwenden