无法使用在子对象和兄弟对象

时间:2016-05-03 10:52:46

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

如果这是一个重复的查询,请说明哪个具有此类案例的确切原因,因为我找不到任何一个。

我正在尝试使用xml序列化程序将以下对象序列化为xml,但是会出现一些异常。

[Serializable]
public class KAD
{
    public KAD()
    {
        StaffMembers = new List<StaffMember>();
        Jobs = new List<Job>();
        Tasks = new List<Task>();
    }
    public List<StaffMember> StaffMembers { get; set; }

    public List<Job> Jobs { get; set; }

    public List<Task> Tasks { get; set; }
}


public class Job
{
    public Job()
    {

    }
    public int? JobId { get; set; }
    public string JobTitle { get; set; }
 }

public class Task
{
    public Task()
    {

    }
    public int? TaskId { get; set; }
    public string TaskTitle { get; set; }
}

我的StaffMember类是不同的命名空间,并且具有子属性,但具有相同的名称,即任务和作业。

 public class StaffMember
 {
    public StaffMember()
    {
        Jobs = new List<Job>();
    }
    public int StaffMemberID { get; set; }        
    public List<Job> Jobs { get; set; }
}

public class Task
{
    public int? TaskId { get; set; }
    public string TaskTitle { get; set; }
    public bool? OverAllTaskCompetency { get; set; }
    public DateTime? ExpireyOfNextCompetencyOrLicenceForTask { get; set; }
}

public class Job
{
    public Job()
    {
        Tasks = new List<Task>();
    }

    public int? JobId { get; set; }
    public string JobTitle { get; set; }        
    public decimal? Rate { get; set; }
    public List<Task> Tasks { get; set; }
}

当我尝试初始化序列化程序时,它在这一行给了我一个例外:

 XmlSerializer ser = new XmlSerializer(typeof (KAD)); 
  

未处理的类型&#39; System.InvalidOperationException&#39;发生在System.Xml.dll

其他信息:反映类型&#39; KAD&#39;时出现错误。如果有人建议可能的解决方案,将不胜感激。还有一件事,我不能改变子和父范围的类名。

3 个答案:

答案 0 :(得分:1)

要序列化可空属性,您需要将它们标记为这样,如下所示:

[XmlElement(IsNullable = true)]
public int? JobId { get; set; }

你真的需要这些属性可以为空吗?

答案 1 :(得分:1)

将xml命名空间添加到您的类中:

  [XmlType(TypeName = "Task",
      Namespace = "Tester.Staff")]
    public class Task
    {
        public int? TaskId { get; set; }
        public string TaskTitle { get; set; }
        public bool? OverAllTaskCompetency { get; set; }
        public DateTime? ExpireyOfNextCompetencyOrLicenceForTask { get; set; }
    }

    [XmlType(TypeName = "Job",
         Namespace = "Tester.Staff")]
    public class Job
    {
        public Job()
        {
            Tasks = new List<Task>();
        }

        public int? JobId { get; set; }
        public string JobTitle { get; set; }
        public decimal? Rate { get; set; }
        public List<Task> Tasks { get; set; }
    }

答案 2 :(得分:1)

我找到了解决这个问题的方法。

通过添加父对象的名称空间和名称,序列化程序可以将它们与子对象区分开来。像父作业和任务类使用属性XmlRoot:

[XmlRoot("KAD_Job", Namespace = "root")]
public class Job
{
    public Job()
    {

    }
    public int? JobId { get; set; }
    public string JobTitle { get; set; }
    public string CraftCode { get; set; }
    public decimal? Rate { get; set; }
}
[XmlRoot("KAD_TASK", Namespace = "root")]
public class Task
{
    public Task()
    {

    }
    public int? TaskId { get; set; }
    public string TaskTitle { get; set; }
}

这对我有用。感谢。