Сериализация объектов Linq не работает - PullRequest
3 голосов
/ 15 апреля 2010

Используя следующий код:

    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 как UniDirectional, и когда я проверяю код dbml за всеми элементами DataContract ()> и DataMember ()>.

Я не уверен, как поступить.Я пытался добавить различные варианты данных и установить для отложенной загрузки значение false, но не повезло.

Идеи?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2010

Это работает для меня, когда свойство режима сериализации .dbml установлено в UniDirectional:

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 голосов
/ 15 апреля 2010

Я думаю, что проблема возникает из-за того, что запросы LINQ обрабатываются только по запросу и не сериализуются. Попробуйте сериализовать сериализуемый тип данных, полученный в результате запроса LINQ (массив, список, отдельный элемент и т. Д.)

dcs.WriteObject(writer, customer.ToArray)

(я полагаю, вам нужно только сериализовать результаты запроса, а не сам запрос)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...