我正在尝试序列化List< T>其中T:EntityObject,并希望从列表中的项目中省略所有EntityKey和其他EntityReference属性。可以使用XmlAttributeOverrides动态完成吗?
据我所知,XmlAttributeOverrides选项仅指向顶级对象,即List< T>。而不是T本身,这对我没有多大帮助。 有人能指出我动态忽略ArrayItems属性的方法吗?
这是一个我一直在使用的不使用EntityObjects的简单示例,但它应该说明我想要做的事情:
public class Car
{
public String Make { get; set; }
public String Model { get; set; }
public Double EngineSize { get; set; }
}
[Test]
public void WouldLoveToDynamicallyLeaveOutMembersOfArrayItems()
{
var cars = new List<Car>
{
new Car
{
Make = "Ferrari",
Model = "F1",
EngineSize = 6000
},
new Car
{
Make = "Williams",
Model = "F1",
EngineSize = 5500
}
};
var attributeOverrides = new XmlAttributeOverrides();
attributeOverrides.Add(typeof(Double), "EngineSize", new XmlAttributes {XmlIgnore = true});
var xs = new XmlSerializer(cars.GetType(), attributeOverrides, new []{ typeof(Car) }, new XmlRootAttribute("cars"), "");
var ms = new MemoryStream();
xs.Serialize(ms, cars);
ms.Position = 0;
var sr = new StreamReader(ms);
var result = sr.ReadToEnd();
Assert.IsFalse(result.Contains("EngineSize"));
}
答案 0 :(得分:1)
是的,你可以这样做 - 主要的错误是你需要typeof(Car)而不是typeof(double)。有了这个,请注意XmlAttributeOverrides 不 只适用于顶级注入。
但是,我不确定这是最简单的路线。首先,请注意, 必须 在使用XmlAttributeOverrides时存储并重新使用序列化程序,否则会泄漏程序集。
我期待你想要这样做的主要原因是因为你不想编辑他生成的文件。但是,还有另一种方式;在单独的文件中,在正确的命名空间中,您可以使用:
partial class Car {
public bool ShouldSerializeEngineSize() { return false; }
}
其中“ShouldSerialize *”是XmlSerializer识别并使用的模式,用于控制条件序列化。 “部分”类只是将两个单独的代码文件组合成单个类型的一种方式(并且是为此生成内容方案设计的)。
这样,你不需要乱用XmlAttributeOverrides,你可以使用更简单的“new XmlSeralizer(Type)”(每种类型都有自动缓存)。