首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >序列化linq结果时出错

序列化linq结果时出错
EN

Stack Overflow用户
提问于 2010-12-03 07:45:21
回答 1查看 1.1K关注 0票数 0

我尝试以这种方式序列化LINQ结果:

代码语言:javascript
复制
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  

但在这条线上:

代码语言:javascript
复制
        Dim xmlFile As New Xml.Serialization.XmlSerializer(sourceForXML.GetType) 

我得到了这个错误:

代码语言:javascript
复制
**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**

有人知道这是怎么回事吗?我该如何解决这个问题?

致以敬意,

克劳迪奥

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-03 07:53:11

奇怪的是,您想序列化的。但是如果你愿意:只需将.ToList()添加到你的sourceForXML中,它就会被序列化。但结果会很奇怪。(不知道方法扩展在VB中是否可用,如果没有,则使用Enumerable.ToList( /* From .... Join ... here */))

Imho,一个好的解决方案是不使用匿名类型进行序列化。使用需要保存的属性创建类,然后使用linq创建该项目的列表,并在序列化该集合之后。在C#中,它类似于:

代码语言:javascript
复制
class DataForXml
{
    public string Field1 {get; set;}
    public string Filed2 {get; set;}
    // other needed fields here
}

您的方法应该将所需的信息提取到该类的实例中:

代码语言:javascript
复制
var xmlData = PayrollRegisterModel.CompanyDetails
       .Join(/* other table */) 
       .Select(x => new DataForXml { Field1 = x.Field1, Field2 = x.Field2 /* init other props here*/})
       .ToList();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4341193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档