XML Serializer没有序列化具有公共getter但没有setter的属性

时间:2012-09-12 21:55:22

标签: c# xml xml-serialization

我想知道我是否遗漏了任何内容...我的理解是,我应该能够在反序列化后获取ID属性(但不能设置它)。就目前而言,ID属性根本没有带来:

namespace CableSolve.Orders.Core.Dto
{
    [Serializable]
    [XmlRoot("Task"), SoapType("Task")]
    public class TaskDto : IDto
    {
        // ReSharper disable ConvertToAutoPropertyWithPrivateSetter
        private int _id;
        public int ID { get { return _id; } }
        // ReSharper restore ConvertToAutoPropertyWithPrivateSetter
        public int TaskSequence { get; set; }

        public TaskDto()
        {
        }
    }
}

理想情况下,我的ID无法设置。如果我给ID属性一个自动的私有setter - XML Serializer会引发一个拟合。我认为解决方法是described here,但它似乎不适用于非集合?我宁愿不必在此时使用DataContract重写。

  

'CableSolve.Web.Api.WorkflowServicesProxy.TaskDto'不包含'ID'的定义,也没有接受第一个类型为'CableSolve.Web.Api.WorkflowServicesProxy.TaskDto'的扩展方法'ID'

1 个答案:

答案 0 :(得分:1)

deserialiser只是C#代码。它需要一个序列化属性的setter。因此,您必须为XML序列化程序要序列化的每个属性都有一个getter和setter;它还要求财产公开。

此外,您不需要该类的空构造函数。

[Serializable]
[XmlRoot("Task"), SoapType("Task")]
public class TaskDto : IDto
{
    public int ID { get; set; }
    public int TaskSequence { get; set; }
}

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx