【问题标题】:How do I serialize a generated class?如何序列化生成的类?
【发布时间】:2026-01-22 03:55:01
【问题描述】:

我正在做一个项目,我想通过网络服务从数据库中发送一个实体。

我将此作为我的数据合同。

[DataContract]
public class CreateAlumniRequest
{
    [DataMember]
    public List<Alum.Data.EmploymentHistory> lstEmploymentHistory;
}

但是,我不断收到此错误。

类型 'Alum.Data.Base.EmploymentHistoryBase' 不能序列化。考虑标记 它与 DataContractAttribute 属性,并标记其所有 您想要序列化的成员 DataMemberAttribute 属性。如果 type 是一个集合,考虑标记 它与 CollectionDataContractAttribute。

这告诉我我可能需要转到就业历史课程并将其标记为 DataContract。

问题是就业历史是由内部 ORM 工具生成的 - 我无法对其进行任何更改。

是否可以在类中不添加该属性的情况下序列化就业历史?

还有其他解决办法吗?我唯一能想到的就是在可序列化的类中重新创建就业历史并手动映射对象,这听起来像是很多重复。

【问题讨论】:

    标签: .net wcf serialization orm code-generation


    【解决方案1】:

    我不确定您尝试使用哪个序列化程序,但如果 Alum.Data.EmploymentHistory 无法序列化,因为它没有被标记为可序列化或出于其他原因......应该能够右键单击在它上面并提取接口。使用创建一个类来使用重构菜单实现接口,并在成员上实现 {get;set;}。然后你可以使用automapper 来映射数据。

    听起来很多,但实际上会非常快......并且可以避免所有手动映射。即使您不为此使用自动映射器,它也绝对值得一看。在很多情况下,您需要将数据从一个对象复制到另一个对象……“AssertConfigurationIsValid”使测试映射变得容易。如果您使用数组或列表或任何类型的嵌套对象,事情会自动处理......非常酷......检查一下。

    【讨论】:

    • 这可能是我必须要做的。我只是不喜欢这样一个事实,即如果就业历史发生变化,我将不得不记住重新映射变量。
    【解决方案2】:

    如果您的代码生成器创建部分类,您可以将缺失的属性添加到新的部分文件中。

    如果没有,您可以尝试其他开源序列化程序,例如 SharpSerializerprotobuf-net

    【讨论】:

    • 您可以使用此方法添加接口实现,但不能将属性添加到已在生成文件中声明的属性。这就是为什么 DataAnnotations 为我们提供了伙伴类方法,我认为 WCF 不支持这种方法。但是,创建一个包含生成文件中定义的所有属性的接口,然后将其应用到部分类中是可行的。
    • 可序列化类型不一定需要[DataContract] 属性,但WCF 显然遇到了EmploymentHistory 类的一部分或属性,它可能无法序列化。在这种情况下,某些属性将需要 [DataMember]。