代码之家  ›  专栏  ›  技术社区  ›  bulltorious

序列化LINQ对象不工作

  •  3
  • bulltorious  · 技术社区  · 16 年前

    使用以下代码:

        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代码时。

    我不知道该怎么办。我试过添加各种dataloadoptions并将deferredloading设置为false,但没有成功。

    思想?

    2 回复  |  直到 16 年前
        1
  •  2
  •   RyanBrady    16 年前

    这对我很有用,将.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
  •  2
  •   M.A. Hanin    16 年前

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

    dcs.WriteObject(writer, customer.ToArray)
    

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