我正在尝试序列化一个列表,其中T: EntityObject,并且希望从列表中的项中省略所有的EntityKey和其他EntityReference属性。这可以使用XmlAttributeOverrides动态完成吗?
据我所知,XmlAttributeOverrides选项实际上只指向顶层对象,即列表,而不是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"));
}发布于 2011-11-11 14:00:31
是的,你可以这样做--主要的错误是你需要的是typeof(Car)而不是typeof(double)。因此,请注意,XmlAttributeOverrides 不只是应用于顶级对象。
然而,我不确定这是最简单的路线。首先,请注意,在使用XmlAttributeOverrides时,必须存储和重用序列化程序,否则会泄漏程序集。
我认为你这样做的主要原因是因为你不想编辑他生成的文件。但是,还有另一种方法;在单独的文件中,在正确的名称空间中,您可以使用:
partial class Car {
public bool ShouldSerializeEngineSize() { return false; }
}其中"ShouldSerialize*“是XmlSerializer识别并使用的模式,用于控制条件序列化。"partial“类只是将两个单独的代码文件组合成单个类型的一种方法(它是为生成内容的场景而设计的)。
这样一来,你就不需要和XmlAttributeOverrides打交道了,你可以使用更简单的“新XmlSeralizer(类型)”(它有每个类型的自动缓存)。
https://stackoverflow.com/questions/8090107
复制相似问题