【问题标题】:C#-Xml Serialization - Serializing the wrong formatC#-Xml 序列化 - 序列化错误的格式
【发布时间】:2018-07-20 07:43:22
【问题描述】:

所以,我有一个我想要序列化的 Person 类(顺便说一下,我对序列化很陌生):

[Serializable()]
public class Person : ISerializable
{
    public string Name { get; set; } = "No name";
    public int Age { get; set; } = 5;
    public string Gender { get; set; } = "Female";
    public Person(string name, int age, string gender)
    {
        Name = name;
        Age = age;
        Gender = gender;
    }
    public Person() { }
    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue("Name", Name);
        info.AddValue("Gender", Gender);
    }
    public Person(SerializationInfo info, StreamingContext context)
    {
        Name = (string)info.GetValue("Name", typeof(string));
        Gender = (string)info.GetValue("Gender", typeof(string));
    }
}

但是,当我对其进行序列化并打开我序列化到的文件时,该文件还包含 Age 属性的值。尽管如此,我并没有在 GetObjectData 方法中说“info.AddValue("Age", Age)”。这是我用来序列化的代码,可能有问题:

Person person1 = new Person("Raksa", 13, "Male");

XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person));
using (Stream stream = new FileStream(@"C:\Users\Marc\Desktop\Testdat.txt", FileMode.Create))
{
    xmlSerializer.Serialize(stream, person1);
}

那么,这里有什么问题?从技术上讲,在序列化期间,它将序列化我在 GetObjecctData 方法中定义的我想要序列化的内容(这是微软所说的)。

附:非常感谢!欣赏它。

【问题讨论】:

标签: c# serialization


【解决方案1】:

XmlSerializer 根本不使用ISerializable(或[Serializable]);它要么使用IXmlSerializable(我确实推荐这样做),要么使用关于类型的隐式或显式形状信息。在您的情况下,您想要的只是:

public class Person
{
    public string Name { get; set; } = "No name";
    [XmlIgnore]
    public int Age { get; set; } = 5;
    public string Gender { get; set; } = "Female";
    public Person(string name, int age, string gender)
    {
        Name = name;
        Age = age;
        Gender = gender;
    }
    public Person() { }
}

你需要的位是:

  • public 类型
  • 使用public 无参数构造函数
  • 默认情况下,公共属性被序列化为同名元素除非它们被标记为[XmlIgnore]

您可以使用许多其他影响 xml 的属性来进行更精细的控制(属性、xml 文本、根名称、命名空间等)。


为了完整起见,请注意BinaryFormatter 使用ISerializable,但是...您一般应该避免使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2011-08-09
    • 2011-05-12
    • 1970-01-01
    相关资源
    最近更新 更多