2009-08-14 15 views
0

Ich versuche, einige Linq-Objekte mit diesem Code zu serialisieren.Probleme beim Serialisieren von DBML-Objekten 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); 

    } 
} 

Dies funktioniert auf alle Objekte. Ich habe die DBML als unidirektional für die Serialisierung markiert. Ich habe auf meinem DBML Typ B, der vom Typ A abgeleitet ist. Ich kann jede serialisieren, aber Typ C hat eine Sammlung von Typ B auf ihm. Wenn ich versuche, einen Typ C zu serialisieren, der seine B geladen hat, schlägt er mit einer Nachricht wie dieser fehl.

{ "‚B‘Typ mit Datenvertrag Namen ‚B: http://schemas.datacontract.org/2004/07/DLLNAME‘ wird erwartet, dass nicht alle Typen hinzufügen nicht statisch auf die Liste der bekannten Arten bekannt - zum Beispiel durch die mit Knowntype. Attribut oder durch sie in die Liste der bekannten Typen weitergegeben DataContractSerializer hinzufügen. "}

Irgendwelche Ideen? Jeder geht von selbst gut.

aktualisieren 1

sollte ich auch erklären, weiß ich, was der Fehler bedeutet. Ich habe das Knowntype-Attribut zuvor verwendet. Ich habe zwei Fragen hier. Zum einen sollte die DBML das bekannte Attribut generieren. Die andere ist, warum die Klassen serialisieren, wenn ich sie selbst erstelle. Zum Beispiel

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

Das funktioniert.

Dies nicht.

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

Update 2

Wenn Sie die Serialisierung unidirektionale gesetzt, erhalten alle Klassen die Attribute Datacontract, und Sie erhalten auch datamemeber zu den Mitgliedern Attribute.

+0

hast du das Datacontract Attribut auf Klassen B und C? –

Antwort

1

Die Antwort ist in der Ausnahmemeldung ... gelten die Knowntype Klasse A:

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

Siehe Update. –

+0

Ich habe am Ende nur diese zur Klasse hinzugefügt. Ich dachte wirklich, es würde generiert werden. –

Verwandte Themen