【问题标题】:How to Serialize Nested Classes and Collections into XML?如何将嵌套类和集合序列化为 XML?
【发布时间】:2014-07-02 04:48:31
【问题描述】:

首先,我在互联网上尝试了不同的方式,但我没有得到我想要的。我有具有以下属性的视图模型类;

public class UserEntitySubmissionsReportViewModel
    {
        public UserEntitySubmissionsReportViewModel()
        {
            Submissions = new FinalUserEntitiesAssignmentViewModel();
        }
        public int Id { get; set; }
        public int Status { get; set; }
        public DateTime SubmissionDate { get; set; }
        public int UserEntityAssignmentId { get; set; }
        public FinalUserEntitiesAssignmentViewModel Submissions { get; set; }
    }

以及嵌套类 FinalUserEntitiesAssignmentViewModel 是什么;

[Serializable]
public class FinalUserEntitiesAssignmentViewModel
{
    public FinalUserEntitiesAssignmentViewModel()
    {
        ProjectInformation = new ProjectInformationViewModel();
        MilestoneInformation = new MilestoneInformationViewModel();
        ActivityListInformation = new ActivityListInformationViewModel();
        ActivityInformation = new ActivityInformationViewModel();
        SubActivityInformation = new List<SubActivityInformationViewModel>();
    }
    [XmlElement(ElementName = "ProjectInformation")]
    public ProjectInformationViewModel ProjectInformation { get; set; }
    [XmlElement(ElementName = "MilestoneInformation")]
    public MilestoneInformationViewModel MilestoneInformation { get; set; }
    [XmlElement(ElementName = "ActivityListInformation")]
    public ActivityListInformationViewModel ActivityListInformation { get; set; }
    [XmlElement(ElementName = "ActivityInformation")]
    public ActivityInformationViewModel ActivityInformation { get; set; }
    [XmlElement(ElementName = "SubActivityInformation")]
    public List<SubActivityInformationViewModel> SubActivityInformation { get; set; }
}
[Serializable]
public class ProjectInformationViewModel
{
    [XmlElement(ElementName = "Id")]
    public int Id { get; set; }
    [XmlElement(ElementName = "Name")]
    public string Name { get; set; }
    public string Description { get; set; }
}

当我序列化这个时,我只得到 1 个属性,即嵌套类的 Id。

    var obj = new UserEntitySubmissionsReportViewModel();
    var writer = new System.Xml.Serialization.XmlSerializer(typeof(UserEntitySubmissionsReportViewModel));

    System.IO.StreamWriter file = new System.IO.StreamWriter(Server.MapPath("~/App_Data/UserEntitySubmissionsReportViewModel.xml"));
    writer.Serialize(file, obj);
    file.Close();

我得到的结果是;

<?xml version="1.0" encoding="utf-8"?>
<UserEntitySubmissionsReportViewModel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Id>0</Id>
  <Status>0</Status>
  <SubmissionDate>0001-01-01T00:00:00</SubmissionDate>
  <UserEntityAssignmentId>0</UserEntityAssignmentId>
  <Submissions>
    <ProjectInformation>
      <Id>0</Id>
    </ProjectInformation>
    <MilestoneInformation>
      <Id>0</Id>
    </MilestoneInformation>
    <ActivityListInformation>
      <Id>0</Id>
    </ActivityListInformation>
    <ActivityInformation>
      <Id>0</Id>
      <Attributes />
      <Tools />
    </ActivityInformation>
  </Submissions>
</UserEntitySubmissionsReportViewModel>

如您所见,我无法序列化其他属性。同样,我也有巢收藏。如何使用 C# 序列化嵌套属性?

【问题讨论】:

  • 您是否尝试过为序列化程序不输出的属性设置值? Id 的默认值为 0,但所有其他属性的默认值为 null...
  • @DaveParsons 不,但我只需要这些类的模式。它是一个复杂的嵌套视图模型
  • 我不确定您为什么要序列化 ​​ViewModel 类。将 Name 和 Id 属性表示为 XML 属性不是更好吗?获得所需内容的一种简单方法是用 XML 编写预期的输出,然后使用 Visual Studio 非常有用的将 XML 粘贴为类工具。
  • @MikeofSST,我需要这个用于水晶报告的 xml 架构

标签: c# .net xml asp.net-mvc serialization


【解决方案1】:

我认为在序列化 XML 时,您需要为您的类定义一个默认构造函数。尝试为您的 ProjectInformationViewModel 类添加构造。

public class ProjectInformationViewModel
{
    // Default Constructor
    public ProjectInformationViewModel()
    {

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多