2009-08-14 9 views
0

J'essaie de sérialiser certains objets Linq en utilisant ce code.Problèmes de sérialisation des objets DBML C#

private byte[] GetSerializedObj(object o) 
{ 
    try 
    { 
     DataContractSerializer formatter = new DataContractSerializer(o.GetType()); 
     MemoryStream memStream = new MemoryStream(); 
     formatter.WriteObject(memStream, o); 
     return memStream.ToArray(); 
    } 
    catch (Exception ex) 
    { 
     throw new Exception("Could not serialize object", ex); 

    } 
} 

Cette procédure s'applique à tous les objets. J'ai marqué le DBML comme unidirectionnel pour la sérialisation. J'ai sur mon DBML type B qui dérive du type A. Je peux sérialiser chacun, mais le type C a une collection de type B dessus. Lorsque j'essaie de sérialiser un type C qui a ses B chargés, il échoue avec un message comme celui-ci.

{ "Type 'B' avec le nom de contrat de données 'B: http://schemas.datacontract.org/2004/07/DLLNAME' ne devrait pas Ajouter tous les types non connu statiquement à la liste des connus types - par exemple, en utilisant le KnownTypeAttribute. attribut ou par les ajouter à la liste des types connus passé à DataContractSerializer. "}

Toutes les idées? Chacun va par lui-même bien.

Update 1

Je dois aussi expliquer je sais ce que signifie l'erreur. J'ai utilisé l'attribut knowntype avant. J'ai deux problèmes ici. Le premier est que DBML devrait générer l'attribut connu. L'autre est, pourquoi les classes sérialisent quand je les crée elles-mêmes. Par exemple,

A item = new B() 
GetSerializedObj(item); 

Cela fonctionne.

Ce n'est pas le cas.

C item = new C(); 
item.Bs.Add(new B()); 
GetSerializedObj(item); 

Mise à jour 2

Lorsque vous définissez la sérialisation à unidirectionnel, toutes les classes obtenir les attributs DataContract, et vous obtenez également datamemeber attribue aux membres.

+0

avez-vous mis l'attribut DataContract sur les classes B et C? –

Répondre

1

La réponse est dans le message d'exception ... appliquer la KnownTypeAttribute à la classe A:

[KnownType(typeof(B))] 
class A 
{ 
    ... 
} 
+0

S'il vous plaît voir la mise à jour. –

+0

J'ai fini par les ajouter à la classe. Je pensais vraiment que ça serait généré. –

Questions connexes