2009-03-03 12 views
6

So che un costruttore privato senza parametri funziona ma che ne è di un oggetto senza costruttori senza parametri?È possibile serializzare oggetti senza un costruttore senza parametri in WCF?

Vorrei esporre i tipi da una libreria di terze parti in modo da non avere alcun controllo sulle definizioni dei tipi.

Se esiste un modo qual è il più semplice? Per esempio. Non so cosa dovere creare un sottotipo.

Edit:

Quello che sto cercando è qualcosa di simile al livello di personalizzazione mostrato qui: http://msdn.microsoft.com/en-us/magazine/cc163902.aspx anche se io non voglio avere a ricorrere alla flussi per serializzare/deserializzare.

risposta

5

Non si può davvero fare tipi arbitrarie serializzabile; in alcuni casi (XmlSerializer, ad esempio) il runtime espone le opzioni per falsificare gli attributi. Ma DataContractSerializer non lo consente.opzioni praticabili:

  • nascondono le classi dietro i propri tipi che sono serializzabili (un sacco di lavoro)
  • forniscono surrogati formattatore binario (yeuch)
  • scrivere il proprio nucleo serializzazione (un sacco di lavoro per ottenere di destra)

in sostanza, se qualcosa non è progettato per la serializzazione, molto poco del quadro sarà lasciare lo serializzi.

+0

È un peccato, mi piacerebbe qualcosa come i metodi di estensione in cui il framework cerca un metodo di estensione sull'oggetto e se esiste lo chiama per serializzare/deserializzare. –

+1

Il framework non può davvero cercare metodi di estensione; sono un trucco per compilatore. Se esistessero più, quale sceglieresti? Quello che descrivi è vicino alle surrogate, ma è ancora molto lavoro. –

+0

Sì, immagino che dovresti registrare la tua implementazione in qualche modo. Ci sono così tanti hook in WCF se solo ce ne fosse uno per la serializzazione che fosse semplice e potente (cioè non è necessario possedere i tipi serializzati). –

1

Non sono un esperto di WCF ma è improbabile che supportino la serializzazione su un costruttore con tipi arbitrari. Vale a dire perché cosa passerebbero per i valori? È possibile passare null per i tipi di riferimento e i valori vuoti per le strutture. Ma a che serve un tipo che potrebbe essere costruito con dati completamente vuoti?

Penso che si sono bloccati con 1 su 2 opzioni

  1. Sub classe del tipo in questione e passare i valori predefiniti appropriati per il costruttore senza parametri non
  2. Creare un tipo che esiste soley per la serializzazione. Una volta completato, può creare un'istanza del tipo originale a cui sei interessato. È un ponte di sorta.

Personalmente vorrei andare per # 2. Rendi la classe una struttura di soli dati e ottimizzala per la serializzazione e gli scopi di fabbrica.

+0

Il problema con questo è che ci sono molti tipi nella libreria e dovrei mappare tutti i tipi attraverso cui è ciò che sto facendo ora con un sottoinsieme dei tipi nella libreria di terze parti. –

1

Ho appena eseguito un piccolo test, utilizzando un servizio WCF che restituisce un oggetto di base che non ha un costruttore predefinito.

//[DataContract] 
//[Serializable] 
public class MyObject 
{ 
    public MyObject(string _name) 
    { 
     Name = _name; 
    } 

    //[DataMember] 
    public string Name { get; set; } 

    //[DataMember] 
    public string Address { get; set; } 
} 

Ecco ciò che il servizio si presenta come:

public class MyService : IMyService 
{ 
    #region IMyService Members 

    public MyObject GetByName(string _name) 
    { 
     return new MyObject(_name) { Address = "Test Address" }; 
    } 

    #endregion 
} 

Questo funziona in realtà, a patto che MyObject o è un [DataContract] o [Serializable]. È interessante notare che non sembra aver bisogno del costruttore predefinito sul lato client. C'è un post correlati qui:

How does WCF deserialization instantiate objects without calling a constructor?

+0

Sfortunatamente i tipi di framework di terze parti non sono contrassegnati come [DataContract] o [Serializable]. –

+0

Ciò significa che non sono stati progettati per la serializzazione, quindi non serializzarli. –

+1

Potrebbe essere possibile scrivere un oggetto adattatore serializzabile che avvolge i tipi di terze parti e serializza solo le parti necessarie. –

Problemi correlati