【问题标题】:Cannot serialize an object using XML Serializer having object names same in child object and sibling objects无法使用在子对象和兄弟对象中具有相同对象名称的 XML 序列化器序列化对象
【发布时间】:2016-05-03 10:52:46
【问题描述】:

如果这是一个重复的查询,请指出导致这种情况的确切原因,因为我找不到任何一个。

我正在尝试使用 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 类是不同的命名空间,并且再次具有子属性但名称相同,即 Task 和 Job。

 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; }
}

当我尝试初始化 serializer 时,它在这一行给了我一个异常:

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

System.Xml.dll 中出现“System.InvalidOperationException”类型的未处理异常

附加信息:反映类型“KAD”的错误。如果有人提出可能的解决方案,将不胜感激。还有一件事,我无法同时更改子范围和父范围的类名。

【问题讨论】:

  • 检查内部异常,看看是什么错误导致序列化器无法反映KAD类型。
  • 它说:{“反映属性‘工作’时出错。”}
  • 那么内部异常肯定有内部异常,递归异常直到没有内部异常,这就是它的根本原因。
  • 是的,内部异常中有一个内部异常。这有助于我理解实际问题。实际上,子类和父类中的 Job 和 Task 类是可用的,这导致了问题。因此找到了使用在父类上添加属性的解决方案,例如 [XmlRoot("KAD_Job", Namespace = "root")]
  • 另外,如果之前的答案没有解决您的问题并且您发布了自己的解决方案,那么请接受您自己的回复。

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


【解决方案1】:

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

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

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

【讨论】:

  • 好的,谢谢。我将添加属性以指定可为空的属性。而且,是的,我需要它们,即使这对于某些业务需求是可以为空的。
【解决方案2】:

将 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; }
    }

【讨论】:

    【解决方案3】:

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

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

    这对我有用。谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 2017-12-15
      相关资源
      最近更新 更多