2009-04-06 3 views
2

Ich konvertiere einige meiner Klassen, um DataContractSerialization zu verwenden, damit ich Linq Entities in die Ausgabe einschließen kann. Eine Art von theoretischer Frage kam mir in den Sinn, und während ich wette, die Antwort ist "Nein", dachte ich mir, dass ich die Frage trotzdem stellen würde.Können Sie eine konditionale Kontrolle über die Serialisierung mit DataContractSerializer erhalten?

Gibt es eine Möglichkeit, ein Objekt seriell zu serialisieren? Wenn ich beispielsweise ein Employee-Objekt mit der Absicht serialisiere, Informationen an einen Kunden zu senden, möchte ich die Adresse möglicherweise nicht einschließen. Auf der anderen Seite, wenn ich es serialisiere, um es in einem Webdienst für die Seite zu verwenden, die diesen Angestellten verwaltet, könnte ich diese Information benötigen.

Eine weitere Möglichkeit wäre die Serialisierung bestimmter Elemente basierend darauf, ob sie das Basisobjekt serialisiert haben oder nicht. Wenn ich also eine Ticket-Klasse habe, die einen Standort enthält, und der Standort eine Liste von Kontakten enthält, würde ich diese Kontaktliste wahrscheinlich nicht wollen, wenn ich das Ticket serialisieren würde. Aber wenn ich versuche, mit dem Standort selbst zu arbeiten, könnte es gut sein, zu haben.

Also irgendwelche Gedanken dazu?

Antwort

0

Ich habe WCF noch nicht verwendet, aber ich weiß mit Standard-Serialisierung in .NET (Attribut basiert), ich könnte eine OnSerializing und eine OnDeserialized-Methode für eine Klasse haben; Vielleicht bietet WCF etwas ähnliches? Innerhalb dieser Methoden können Sie Daten bedingungslos entfernen (bedenken Sie jedoch, dass sich Ihr Objekt geändert hat, was ein ziemlich unangenehmer Nebeneffekt der Serialisierung ist).

Beispiel:

public class Employee 
{ 
    public Address HomeAddress { get; set; } 

    [OnSerializing] 
    private void RemoveAddress(StreamingContext context) 
    { 
     if (1 == 1) // replace with your condition 
      HomeAddress = null; 
    } 

    [OnDeserialized] 
    private void PutAddressBack(StreamingContext context) 
    { 
     if (1 == 1) 
      HomeAddress = LoadHomeAddressFromBackingStore(); 
    } 
} 
0

Ich empfehle gegen LINQ to SQL oder ADO.NET Entity Framework-Objekte von einem Webdienst direkt zurück. Leider werden die Implementierungsspezifikationen serialisiert. Zum Beispiel werden Basisklassenfelder ebenso wie Backlinks serialisiert.

Verwandte Themen