序列化期间排除(忽略)对象

时间:2015-02-06 09:57:44

标签: c# serialization xml-serialization

拥有一个普通的对象层次结构,它继承了所有接口或抽象类的通用。

public abstract class AActivation
{
    public bool IsActivated
    { get; set; }
}

public class Root : AActivation
{
    public int Value
    { get; set; }

    public List<LevelOne> Childs
    { get; private set; }

    public Root()
    {
        Value = 1000;
        Childs = new List<LevelOne>();
    }
}

public class LevelOne : AActivation
{
    static int _i = 0;

    public int Value
    { get; set; }

    public List<LevelTwo> Childs
    { get; private set; }

    public LevelOne()
    {
        Value = (++_i);
        Childs = new List<LevelTwo>();
    }

}

public class LevelTwo : AActivation
{
    static int _i = 100;

    public int Value
    { get; set; }

    public LevelTwo()
    {
        Value = (++_i);
    }
}

目标序列化XML文件排除中的给定对象树,其属性IsActivated等于false的序列化对象。

public class Serializer
{
    public static void Serialize<T>(T serializableObject , string path)
        where T: AActivation , new()
    {
        using(StreamWriter sw = new StreamWriter(path))
        {
            XmlSerializer writer = new XmlSerializer(typeof(T));
            writer.Serialize(sw , serializableObject);
            sw.Flush();
            sw.Close();
        }
    }
}

class Program
{
    static void Main()
    {
        var random = new Random();


        Root r = new Root();

        for(int i = 0 ; i < 10 ; i++)
        {
            var levelOne = new LevelOne() { IsActivated = random.Next(2) > 0};
            r.Childs.Add(levelOne);

            for(int j = 0 ; j < 5 ; j++)
            {
                var levelTwo = new LevelTwo() { IsActivated = random.Next(2) > 0};
                levelOne.Childs.Add(levelTwo);
            }
        }

        string path = Path.Combine(Environment.CurrentDirectory , Path.GetRandomFileName() + ".xml");
        Serializer.Serialize(r , path);

        Console.ReadKey();
    }
}

现在我看到了几个解决方案:

  1. 继承所有类IXmlSerializable接口。但我不想以严肃的方式干扰序列化过程。我只需要改变写作行为,但也必须恢复阅读行为。毕竟,必须恢复默认行为,只需要一行代码。 if(obj.IsActivated == false) return;

  2. 创建自己的XmlWriter。这个较低级别的XML模型,我不想再干涉它的构建。

  3. 我希望我的问题有一个简单的解决方案,干预序列化的过程不会那么多。

0 个答案:

没有答案