拥有一个普通的对象层次结构,它继承了所有接口或抽象类的通用。
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();
}
}
现在我看到了几个解决方案:
继承所有类IXmlSerializable接口。但我不想以严肃的方式干扰序列化过程。我只需要改变写作行为,但也必须恢复阅读行为。毕竟,必须恢复默认行为,只需要一行代码。
if(obj.IsActivated == false) return;
创建自己的XmlWriter。这个较低级别的XML模型,我不想再干涉它的构建。
我希望我的问题有一个简单的解决方案,干预序列化的过程不会那么多。