【问题标题】:Serialize Linq objects not working序列化 Linq 对象不起作用
【发布时间】:2010-04-14 21:22:41
【问题描述】:

使用以下代码:

    Private Sub MakeMeSomeXmlBeforeRyanGetsAngry()

    Dim db As New MyDBDataContext

    Dim customer = From c In db.Customers Select c

    Dim dcs As New DataContractSerializer(GetType(Customer))

    Dim sb As StringBuilder = New StringBuilder
    Dim writer As XmlWriter = XmlWriter.Create(sb)
    dcs.WriteObject(writer, customer)
    Dim xml As String = sb.ToString

    Response.Write(xml)

End Sub

我正在尝试序列化我的 linq 客户集合。但它一直在抛出

无法序列化类型“System.Data.Linq.DataQuery`1[MyDB.Customer]”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。

我的问题是我已经将 dbml 序列化模式标记为单向,并且当我检查所有 DataContract()> 和 DataMember()> 元素的 dbml 代码隐藏时。

我不确定如何继续。我尝试添加各种数据加载选项并将延迟加载设置为 false,但没有运气。

想法?

【问题讨论】:

    标签: asp.net vb.net linq linq-to-sql serialization


    【解决方案1】:

    这对我有用,将 .dbml 的序列化模式属性设置为单向:

    Public Shared Function CreateXml(Of T)(ByVal item As T) As String
        Dim result As String = ""
        Dim memoryStream As New IO.MemoryStream()
        Dim serializer As New DataContractSerializer(GetType(T))
        serializer.WriteObject(memoryStream, item)
        memoryStream.Position = 0
        Using reader As New StreamReader(memoryStream)
            result = reader.ReadToEnd()
        End Using
        memoryStream.Close()
        Return result
    End Function
    
    Dim db As New SerializerDataContext()
    Dim questions = db.Questions.ToList()
    
    Dim xmlFileName As String = "D:\\xml_test.xml"
    If My.Computer.FileSystem.FileExists(xmlFileName) Then My.Computer.FileSystem.DeleteFile(xmlFileName)
    
    Dim xml As String = XmlHelper.CreateXml(Of List(Of Question))(questions)
    My.Computer.FileSystem.WriteAllText(xmlFileName, xml, True)
    

    【讨论】:

      【解决方案2】:

      我认为问题的出现是因为 LINQ 查询仅按需处理,并且不可序列化。尝试序列化由 LINQ 查询产生的可序列化数据类型(数组、列表、单个项目等)

      dcs.WriteObject(writer, customer.ToArray)
      

      (我假设您只需要序列化查询的结果,而不是查询本身)

      【讨论】:

      • 我尝试了您的建议,现在我收到以下错误消息。不应使用数据合同名称“ArrayOfCustomer:schemas.datacontract.org/2004/07/MyDB”键入“MyDB.Customer[]”。将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。还有其他想法吗?
      • 我在哪里可以找到它? .dbml?
      猜你喜欢
      • 2012-09-18
      • 2023-04-06
      • 1970-01-01
      • 2021-01-26
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      相关资源
      最近更新 更多