2010-04-20 5 views
8

Je me demandais si quelqu'un avait eu de la chance pour obtenir un objet DynamicObject pour sérialiser et travailler avec WCF?Prise en charge de DynamicObject et WCF

Voici mon petit test:

[DataContract] 
class MyDynamicObject : DynamicObject 
{ 
    [DataMember] 
    private Dictionary<string, object> _attributes = 
     new Dictionary<string, object>(); 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string key = binder.Name; 

     result = null; 

     if (_attributes.ContainsKey(key)) 
      result = _attributes[key]; 

     return true; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     _attributes.Add(binder.Name, value); 

     return true; 
    } 
} 

var dy = new MyDynamicObject(); 
var ser = new DataContractSerializer(typeof(MyDynamicObject)); 
var mem = new MemoryStream(); 
ser.WriteObject(mem, dy); 

L'erreur que je reçois est:

System.Runtime.Serialization.InvalidDataContractException a été unhandled Message = Type 'ElasticTest1.MyDynamicObject' ne peut pas hériter d'un type qui n'est pas marqué avec DataContractAttribute ou SerializableAttribute. Envisagez de marquer le type de base 'System.Dynamic.DynamicObject' avec DataContractAttribute ou SerializableAttribute ou de les supprimer du type dérivé.

Des suggestions?

+0

Le message d'erreur indique que vous ne pouvez pas le faire sauf si vous modifiez System.Dynamic.DynamicObject que vous ne pouvez pas parce que cela fait partie du .NET Framework. Donc tu ne peux pas faire ça. Qu'est-ce que vous essayez d'atteindre, peut-être qu'il y a une façon différente d'atteindre le même but? – dtb

+0

Bien sûr, bien que vous ne puissiez pas changer DynamicObject, il est open source (http://dlr.codeplex.com/), donc vous pouvez le copier et le modifier. –

+0

J'essaye d'envoyer un DynamicObject sur le fil à un client SL 4. – rboarman

Répondre

2

Pouvez-vous utiliser quelque chose comme Dictionary<TKey, TValue> pour y parvenir? J'essaye de résoudre un problème semblable. Mon problème est que j'ai DTO pour transférer des données entre le client et le serveur. Cependant, vous devriez toujours avoir des DTO à grain fin et aplatis. Par exemple, si un client veut obtenir le nom et l'ID du client et qu'il ne s'intéresse à rien d'autre, idéalement, vous devriez créer un DTO qui n'a que ces 2 propriétés. Si vous transférez le même CustomerDTO pour toutes les méthodes, il y a beaucoup de conséquences sur les performances. Vous pourriez transférer beaucoup de champs redondants.

+0

J'ai abandonné DynamicObjects et est allé avec DTO aplati en utilisant AutoMapper. Cela fonctionne assez bien pour ce dont j'ai besoin. – rboarman