【问题标题】:XMLSerializer : Ignoring Elements in ListXMLSerializer:忽略列表中的元素
【发布时间】:2015-07-14 09:21:10
【问题描述】:

我得到了一个工作良好的 XMLSerializer,用于包含许多不同元素的复杂 3D 模型列表。现在我想序列化除此之外的另一个列表,即只保存它的几个元素。 我只是试图用 [XMLIgnore] 来禁止其中一些,但这会导致我的其他列表的反序列化出现问题。

这是我的 (De)Serializer 的代码:

public void SerializeObject<T>(T serializableObject, string fileName)
{
    if (serializableObject == null) return;

    var serializer = new XmlSerializer(serializableObject.GetType());

    using (var stream = File.Open(fileName, FileMode.Create))
    {
        serializer.Serialize(stream, serializableObject);
    }
}

public T DeserializeObject<T>(string fileName)
{

    if (string.IsNullOrEmpty(fileName)) return default(T);

    var serializer = new XmlSerializer(typeof(T),overrides);

    using (var stream = File.Open(fileName, FileMode.Open))
    {
        return (T)serializer.Deserialize(stream);
    }
}

也许克隆我的列表,并在序列化之前删除我不想保存的所有元素?

【问题讨论】:

  • “也许是克隆我的列表,并在序列化之前删除我不想保存的所有元素的想法?”是的,你应该这样做,绝对同意
  • 创建第二个继承第一个类的类。然后覆盖您要忽略的对象并将 XmlIgnore 标记添加到这些项目。

标签: c# serialization xmlserializer


【解决方案1】:

您可以使用基派生关系来构建您的集合类型,其中一个忽略序列化,另一个覆盖您忽略的内容。

[Serializable]
public abstract class BaseClass
{
    [XmlIgnore]
    public virtual bool BaseMember { get; set; }

}

[Serializable]
public class DerivedClass : BaseClass
{
    public string DerivedMember { get; set; }
}

[Serializable]
public class XmlIgnore : BaseClass
{
    // no XmlIgnore
    public override bool BaseMember
    {
        get
        {
            return base.BaseMember;
        }
        set
        {
            base.BaseMember = value;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多