gpt4 book ai didi

.net - 使用 DataContractSerializer 和 MetaDataTypeAttribute 问题自动生成 POCO 序列化

转载 作者:行者123 更新时间:2023-12-01 13:00:34 25 4
gpt4 key购买 nike

正如标题所说,我在序列化自动生成的 POCO 对象时遇到了一些问题。但首先要了解一些背景信息:

我已经按照本指南使用 EF 4.0 en ADO.Net POCO 实体生成器创建了我的数据访问层:http://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity-framework.aspx .

我现在有 2 个类库,一个带有 EF 模型,第二个带有 T4 自动生成的 POCO 实体。

目前我正在从事另一个项目,我想在其中使用我的 DAL 类库。我必须检索一些对象并将它们序列化为 XML。首先我尝试了 XmlSerializer,但后来我发现它在循环引用方面存在问题。我使用 XmlIgnore 解决了这个问题,但后来我遇到了序列化问题:

Public Overridable Property NwlGroup As ICollection(Of NwlGroup) 

因为XmlSerializer不支持接口(interface)。

其次,我尝试在自动生成的实体 Poco 类文件中使用 [DataContract] 和 [DataMember] 属性的 DataContractSerializer。这行得通,但自然我必须清除自动生成文件中的更改,因此我想使用 MetaDataType 属性。我创建了这样的额外文件:

Imports System.Runtime.Serialization
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(NewsletterCustomerMetadata))>
Partial Public Class NewsletterCustomer
End Class

<DataContract()
Public Class NewsletterCustomerMetadata

<DataMember(Name:="emailaddress", IsRequired:=True)>
Public Overridable Property Emailaddress As String

<DataMember(Name:="name")>
Public Overridable Property Name As String

<DataMember()>
Public Overridable Property NwlGroup As ICollection(Of NwlGroup)
End Class

自动生成的文件:

'------------------------------------------------------------------------------
' <auto-generated>
' This code was generated from a template.
'
' Changes to this file may cause incorrect behavior and will be lost if
' the code is regenerated.
' </auto-generated>
'------------------------------------------------------------------------------
Imports System
Imports System.Collections
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Imports System.Collections.Specialized
Imports System.Runtime.Serialization



Public Class NewsletterCustomer
#Region "Primitive Properties"

Public Overridable Property ID As Integer

Public Overridable Property Emailaddress As String

Public Overridable Property Name As String

...

#Region "Navigation Properties"
Public Overridable Property NwlGroup As ICollection(Of NwlGroup)
Get
If _nwlGroup Is Nothing Then
Dim newCollection As New FixupCollection(Of NwlGroup)
AddHandler newCollection.CollectionChanged, AddressOf FixupNwlGroup
_nwlGroup = newCollection
End If
Return _nwlGroup
End Get
Set(ByVal value As ICollection(Of NwlGroup))
If _nwlGroup IsNot value Then
Dim previousValue As FixupCollection(Of NwlGroup) = TryCast(_nwlGroup, FixupCollection(Of NwlGroup))
If previousValue IsNot Nothing Then
RemoveHandler previousValue.CollectionChanged, AddressOf FixupNwlGroup
End If
_nwlGroup = value
Dim newValue As FixupCollection(Of NwlGroup) = TryCast(value, FixupCollection(Of NwlGroup))
If newValue IsNot Nothing Then
AddHandler newValue.CollectionChanged, AddressOf FixupNwlGroup
End If
End If
End Set
End Property
Private _nwlGroup As ICollection(Of NwlGroup)

...
End Class

然后我尝试将它序列化为xml

    Dim ctx = New ModelEntities(_connectionString)
ctx.ContextOptions.ProxyCreationEnabled = False
ctx.ContextOptions.LazyLoadingEnabled = False

Dim customers = From c In ctx.NwlCustomer
Select c
Where c.SiID = 99

Dim filename As String = "C:\test.txt"
Dim result As NewsletterCustomer = customers.ToList.FirstOrDefault
Dim writer As New FileStream(filename, FileMode.Create)
Dim ser As New DataContractSerializer(GetType(NewsletterCustomer))
ser.WriteObject(writer, customers.ToList.FirstOrDefault)
writer.Close()

这为我提供了 NewsletterCustomer xml,其中所有读/写属性都已序列化,正如您在未指定 DataContract 时所期望的那样。如果我将 DataContract 属性从 NewsletterCustomerMetadata 移动到 NewsletterCustomer,那么当指定没有 DataMember 属性的 DataContract 时,我只会得到根节点。

看起来 DataContractSerializer 不适用于 MetaDataType 数据注释。

我的问题是:

  1. 如何将我的 POCO 类序列化为 CUSTOM XML?
  2. 如何将 [DataContract] 和 [DataMember] 属性添加到自动生成的 POCO 类?
  3. 将自动生成的 POCO 类序列化为 XML 的最佳方法是什么?

最佳答案

First i tried XmlSerializer, but then i found out that it has problems with circural references.

嗯,是的:xml 是一种树格式——它不喜欢循环引用。 DataContractSerializer 不允许任何类似的东西对 xml 进行相同级别的控制,因此我的建议:在这种情况下坚持使用 XmlSerializer,并且 < strong>删除您的循环引用(通常在父属性上使用一些 [XmlIgnore])。

否则:实现 IXmlSerializable,但请注意,这实际上不提供任何元数据,并且很难稳健地执行。

关于.net - 使用 DataContractSerializer 和 MetaDataTypeAttribute 问题自动生成 POCO 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com