可以序列化属性的内部setter吗?

Pat*_*son 28 .net c# serialization

有没有办法在C#中使用内部setter序列化属性?
我知道这可能有问题 - 但如果有办法 - 我想知道.

例:

[Serializable]
public class Person
{
    public int ID { get; internal set; }
    public string Name { get; set; }
    public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

序列化类Person实例的代码:

Person person = new Person();
person.Age = 27;
person.Name = "Patrik";
person.ID = 1;

XmlSerializer serializer = new XmlSerializer(typeof(Person));
TextWriter writer = new StreamWriter(@"c:\test.xml");
serializer.Serialize(writer, person);
writer.Close();
Run Code Online (Sandbox Code Playgroud)

结果(缺少ID属性):

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Name>Patrik</Name>
  <Age>27</Age>
</Person>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 54

如果是一个选项,DataContractSerializer(.NET 3.0)可以序列化非公共属性:

[DataContract]
public class Person
{
    [DataMember]
    public int ID { get; internal set; }
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public int Age { get; set; }
}
...
static void Main()
{
    Person person = new Person();
    person.Age = 27;
    person.Name = "Patrik";
    person.ID = 1;

    DataContractSerializer serializer = new DataContractSerializer(typeof(Person));
    XmlWriter writer = XmlWriter.Create(@"c:\test.xml");
    serializer.WriteObject(writer, person);
    writer.Close();
}
Run Code Online (Sandbox Code Playgroud)

使用xml(重新格式化):

<?xml version="1.0" encoding="utf-8"?>
<Person xmlns:i="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://schemas.datacontract.org/2004/07/">
    <Age>27</Age>
    <ID>1</ID>
    <Name>Patrik</Name>
</Person>
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 5

你可以实现IXmlSerializable,遗憾的是这否定了XmlSerializer最重要的好处(声明性地控制序列化的能力).DataContractSerializer(基于xml)和BinaryFormatter(基于二进制)可以用作XmlSerializer的替代品,每个都有其优点和缺点.