C# 无法使用子对象和同级对象中对象名称相同的XML序列化程序序列化对象

C# 无法使用子对象和同级对象中对象名称相同的XML序列化程序序列化对象,c#,.net,xml,serialization,xml-serialization,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<Tas

如果这是一个重复的查询,请说明这种情况的确切原因,因为我找不到任何一个

我试图使用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; }
}
System.Xml.dll中发生类型为“System.InvalidOperationException”的未处理异常


其他信息:反映类型“KAD”的错误。如果有人提出可能的解决方案,我们将不胜感激。还有一件事,我不能同时更改子作用域和父作用域中的类名。

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

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

但是,您真的需要这些属性可以为null吗?

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

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

但是,您真的需要这些属性为空吗?

将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; }
    }
[XmlType(TypeName=“Task”,
Namespace=“Tester.Staff”)]
公开课任务
{
public int?TaskId{get;set;}
公共字符串TaskTitle{get;set;}
公共bool?总体任务能力{get;set;}
public DateTime?任务{get;set;}
}
[XmlType(TypeName=“作业”,
Namespace=“Tester.Staff”)]
公开课工作
{
公职()
{
任务=新列表();
}
public int?JobId{get;set;}
公共字符串JobTitle{get;set;}
公共十进制?速率{get;set;}
公共列表任务{get;set;}
}

将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; }
    }
[XmlType(TypeName=“Task”,
Namespace=“Tester.Staff”)]
公开课任务
{
public int?TaskId{get;set;}
公共字符串TaskTitle{get;set;}
公共bool?总体任务能力{get;set;}
public DateTime?任务{get;set;}
}
[XmlType(TypeName=“作业”,
Namespace=“Tester.Staff”)]
公开课工作
{
公职()
{
任务=新列表();
}
public int?JobId{get;set;}
公共字符串JobTitle{get;set;}
公共十进制?速率{get;set;}
公共列表任务{get;set;}
}

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

通过为父对象添加名称空间和名称,序列化程序可以将它们与子对象区分开来。与父作业和任务类一样,使用属性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; }
}

这对我很有用。谢谢。

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

通过为父对象添加名称空间和名称,序列化程序可以将它们与子对象区分开来。与父作业和任务类一样,使用属性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; }
}

这对我很有用。谢谢。

检查内部异常以了解序列化程序无法反映KAD类型的错误。它说:{“有一个反映属性'Jobs'的错误”。}然后内部异常必须有一个内部异常,递归异常,直到不再有内部异常,这将是其根本原因。是的,内部异常中有一个内部异常,这帮助我理解了实际问题。实际上,子类和父类中的作业和任务类是可用的,这导致了问题。因此,通过在父类(如[XmlRoot(“KAD_Job”,Namespace=“root”))上添加属性找到了解决方案。此外,如果前面的答案没有解决您的问题,并且您发布了自己的解决方案,那么请接受您自己的响应。检查内部异常以查看序列化程序无法反映KAD类型的错误。它显示:{“反映属性'Jobs'时出错。”}然后内部异常必须有一个内部异常,递归异常直到不再有内部异常,这将是它的根本原因。是的,内部异常中有一个内部异常。这帮助我理解了实际问题。实际上子类和父类中的作业和任务类是可用的,并且s导致问题。因此,通过在父类上添加属性找到了解决方案,如[XmlRoot(“KAD_Job”,Namespace=“root”)]另外,如果前面的答案没有解决您的问题,而您发布了自己的解决方案,那么请接受您自己的回答。好的,谢谢。我将添加属性以指定可为空的属性。是的,我需要它们,即使对于某些业务需求这是可为空的。好的,谢谢。我将添加属性以指定可为空的属性。并且,是的,我需要它们,即使对于某些业务需求这是可以为空的。