2009-06-10 3 views
9

Ich habe eine LINQ 2 SQL generierte Klasse, die ich über einen Webservice bereitstellen möchte. Es gibt einige interne Eigenschaften, die ich nicht verfügbar sein möchte.Verwenden von XmlIgnore für generierte partielle Klassen

Normalerweise würde ich [XmlIgnore] dort hineinwerfen, aber weil die Eigenschaften in der erzeugten Hälfte sind, kann ich das nicht tun.

Ich habe bei der Verwendung von MetadataType folgende this post betrachtet, die aussieht, als ob es mir erlauben sollte, die Eigenschaftenattribute in einer anderen Klasse zu definieren.

Mein Code sieht in etwa wie folgt aus:

[MetadataType(typeof(ProspectMetaData))] 
public partial class Prospect : ApplicationBaseObject 
{ 
} 

public class ProspectMetaData 
{ 
    [XmlIgnore] 
    public object CreatedDateTime { get; set; } 

    [XmlIgnore] 
    public object AmendedDateTime { get; set; } 

    [XmlIgnore] 
    public object Timestamp { get; set; } 
} 

Ich Referenzierung dies durch eine ASP.NET Web Service aus einer Silverlight-Projekt.

Das Problem ist, dass die [XmlIgnore] -Attribute ignoriert werden, diese Eigenschaften werden gesendet.

Hat jemand einen Einblick, was hier schief gehen könnte? und was könnte der beste Weg sein, dies zu tun?

Antwort

3

AFAIK, MetadataTypeAttribute wird nicht von XmlSerializer unterstützt (obwohl es nett wäre - ich habe einfach nie überprüft). Und wie Sie sagen, können Sie keine Mitgliedsattribute in einer partiellen Klasse hinzufügen.

Eine Option kann die erzeugten Eigenschaften nicht-öffentlichen (private, protected oder internal) machen zu - und nennen Sie es so etwas wie TimestampStorage (etc.) - dann wieder setzen sie (in der Teilklasse) an der öffentlichen API:

[XmlIgnore] 
public object Timestamp { 
    get {return TimestampStorage; } 
    set {TimestampStorage = value; } 
} 
// and other properties 

(seit XmlSerializer schaut nur auf die öffentliche API). Das größte Problem hierbei ist, dass LINQ-to-SQL-Abfragen (Where usw.) nur gegen die generierten Spalten (TimestampStorage usw.) funktionieren. Ich habe diesen Ansatz zuvor mit dem Mitglied als internal verwendet, so dass meine DAL-Klasse die internal -Eigenschaft verwenden kann ... aber es ist ein bisschen ein Fudge.

+0

es scheint sicher, dass die Art und Weise, und es ist wirklich eine Schande. Ich habe keine Kontrolle über die Accessoren auf den generierten Eigenschaften, so dass es nicht wirklich für mich löst. Ich denke, ich muss nur mit einer Proxy-Klasse gehen, anstatt meine Geschäftsobjekte zu senden. –

+0

Sie müssen die Zugriffsstufen bei der Regenerierung zurücksetzen. :( –

1

Ich stimme Marc zu. Am einfachsten ist es, sie intern zu markieren. Optional können Sie sie dann in der partiellen Klasse mit [XmlIgnore] wiederbelichten. Übrigens, Sie können die Verfügbarkeit der Eigenschaften im linq2sql-Designer steuern. Rufen Sie den Eigenschaftendialog auf, und Sie sehen einen Platz, um sie festzulegen

+0

Wir verwenden tatsächlich unsere eigenen Code-Generierungs-Tools, um die generierten Hälften auszugeben, als ich LINQ2SQL sagte, es ist die nächste Parallele. Dies könnte jedoch für andere nützlich sein. +1 –

11

Sie können dies tun, indem Sie Ihre eigenen XmlAttributeOverrides an den XmlSerializer übergeben, in den XmlAttributeOverrides können Sie XmlIgnore für die gewünschten Felder/Eigenschaften in true ändern die DBML generierten Code zu berühren und es wirkt wie ein Zauber, die gleichen Überschreibungen verwenden und deserialisieren ...

Refer this link für weitere Informationen

// Create the XmlAttributeOverrides and XmlAttributes objects. 
    XmlAttributeOverrides xOver = new XmlAttributeOverrides(); 

    XmlAttributes attrs = new XmlAttributes(); 
    attrs.XmlIgnore = true; 

    /* Setting XmlIgnore to true overrides the XmlIgnoreAttribute 
     applied to the following fields. Thus it will be serialized.*/ 
    xOver.Add(typeof(Prospect), "CreatedDateTime", attrs); 
    xOver.Add(typeof(Prospect), "AmendedDateTime", attrs); 
    xOver.Add(typeof(Prospect), "Timestamp", attrs); 

    XmlSerializer xSer = new XmlSerializer(typeof(Prospect), xOver); 
    TextWriter writer = new StreamWriter(outputFilePath); 
    xSer.Serialize(writer, object); 
+2

Wirklich nützliche Informationen, danke. –

+0

Dies ist die beste Wahl für mich, danke! –

+0

Gibt es eine Möglichkeit, dies für den JSON-Serializer Newtonsoft.Json zu tun? – Dave