2010-12-02 7 views
0

Ich versuche, ein LINQ Ergebnis auf diese Weise zu serialisiert:Fehler Serialisierung Linq Ergebnis

Private Sub btnXML_Click(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnXML.Click 
    Try 
     Dim sourceForXML = From detail In PayrollRegisterModel.CompanyDetails 
          Join shifts In PayrollRegisterModel.Shifts On detail.Id_companydetail Equals shifts.Id_companydetail 
     Dim xmlFile As New Xml.Serialization.XmlSerializer(sourceForXML.GetType) 
     Dim xw As System.Xml.XmlWriter = Xml.XmlWriter.Create("C:/Abcom/XMLRegister.xml") 
     xmlFile.Serialize(xw, sourceForXML) 
    Catch ex As Exception 
     MsgBox(e.ToString) 
    End Try 
End Sub 

aber in der Zeile:

 Dim xmlFile As New Xml.Serialization.XmlSerializer(sourceForXML.GetType) 

Ich erhalte diese Fehlermeldung:

**System.InvalidOperationException was caught 
    Message=To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. System.Data.Objects.ObjectQuery`1[[VB$AnonymousType_0`2[[Abcom.Payroll.Register.CompanyDetail, Abcom.Payroll.Register, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[Abcom.Payroll.Register.Shift, Abcom.Payroll.Register, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], Abcom.Payroll.Register, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] does not implement Add(System.Object). 
    Source=System.Xml 
    StackTrace: 
     at System.Xml.Serialization.TypeScope.GetEnumeratorElementType(Type type, TypeFlags& flags) 
     at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference) 
     at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError) 
     at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference) 
     at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace) 
     at System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 
     at System.Xml.Serialization.XmlSerializer..ctor(Type type) 
     at Abcom.Payroll.Register.MainWindow.btnXML_Click(Object sender, RoutedEventArgs e) in C:\Abcom\Inhouse Development Tools\Abcom.Payroll.Register\Abcom.Payroll.Register\MainWindow.xaml.vb:line 415** 

Weiß jemand, was hier vor sich geht und wie kann ich dieses Problem lösen?

Grüße,
Claudio

Antwort

2

Es ist seltsam, dass Sie dass serialisiert werden soll. Aber wenn Sie möchten: Fügen Sie einfach .ToList() zu Ihrem sourceForXML hinzu und es wird serialisiert. Aber das Ergebnis wird seltsam sein. (Ich weiß nicht, ob Methodenerweiterungen in VB verfügbar sind, wenn nicht, dann benutze Enumerable.ToList(/* From .... Join ... here */))
Imho, gute Lösung ist nicht anon Typen für die Serialisierung zu verwenden. Erstellen Sie eine Klasse mit Eigenschaften, die Sie speichern möchten, erstellen Sie dann eine Liste dieser Elemente mit linq und nach dem Serialisieren dieser Auflistung. In C# ist es so etwas wie:

class DataForXml 
{ 
    public string Field1 {get; set;} 
    public string Filed2 {get; set;} 
    // other needed fields here 
} 

Und Ihre Methode sollte benötigte Informationen zu Instanzen dieser Klasse extrahiert:

var xmlData = PayrollRegisterModel.CompanyDetails 
     .Join(/* other table */) 
     .Select(x => new DataForXml { Field1 = x.Field1, Field2 = x.Field2 /* init other props here*/}) 
     .ToList(); 
+0

Actualy ich weiß nicht genau, wie dieser Code von C# VB zu übersetzen. Wie auch immer, meine Lösung wird meine Sprache ändern! Danke vielmals! – Claudio

+0

@Claudio Hoppla^_^Ich wollte dich nicht dazu bringen, eine andere Sprache zu wählen) Viel Glück in C#, es ist mächtig und erstaunlich, IMHO. Sie möchten es (früher oder später))) –

Verwandte Themen