gpt4 book ai didi

c# - 如何用派生类序列化基类

转载 作者:太空狗 更新时间:2023-10-29 21:33:40 25 4
gpt4 key购买 nike

.

你好,

我有这个示例代码:

public class Vehicule
{
public string Name { get; set; }
public Brand Brand { get; set; }
}
public class Car : Vehicule
{
public string Matriculation { get; set; }
}



public class Brand
{
public string Name { get; set; }
}
public class Renault : Brand
{
public string Information { get; set; }
}

如果我创建这个实例:

var car = new Car { Name = "Clio", Matriculation = "XXX-XXX", Brand = new Renault { Name = "Renault", Information = "Contact Infos" } };

当我像那样序列化这个对象时:

var serializer = new XmlSerializer(typeof(Car), new Type[] { typeof(Renault)});
serializer.Serialize(wr, car);

我得到这个:

<?xml version="1.0" encoding="utf-8"?>
<Car xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Clio</Name>
<Brand xsi:type="Renault">
<Name>Renault</Name>
<Information>Contact Infos</Information>
</Brand>
<Matriculation>XXX-XXX</Matriculation>
</Car>

但是,在我的项目中,我不需要关于派生类的信息,我只想要来自这个实例的基类元素,如下所示:

var serializer = new XmlSerializer(typeof(Vehicule));
serializer.Serialize(wr, car);

Xml:

<?xml version="1.0" encoding="utf-8"?>
<Vehicule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Clio</Name>
<Brand>
<Name>Renault</Name>
</Brand>
</Vehicule>

你能帮我获得好的Xml(仅限基本类型Vehicule和Brand)吗?

非常感谢

最佳答案

你不能神奇地将派生类序列化为基类,因为

"...Serialization checks type of instance by calling Object.getType() method. This method always returns the exact type of object."

http://bytes.com/topic/net/answers/809946-how-force-serialize-base-type

如果您真的只需要序列化基类,这里的解决方案是实现 IXmlSerializable 接口(interface)并创建您自己的自定义序列化程序。

IXmlSerializable: http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable(v=vs.110).aspx

再想一想。如果您可以解决输出额外 XML 元素的限制,则可以通过以下任一方式仅使用基对象序列化派生类:1) 使用 XmlIncludeAttributes在基类上告诉它期望哪些类型或 2) 使用 XmlSerializer constructor采用类型列表的重载。

编辑:稍微考虑一下之后,解决方法是将 Clone() 方法添加到基础对象上,然后序列化基础对象的克隆。

LinqPad 代码:

public class Vehicule
{
public string Name { get; set; }
public Brand Brand { get; set; }

public Vehicule Clone()
{
return new Vehicule { Name = this.Name, Brand = new Brand { Name = this.Brand.Name } };
}
}
public class Car : Vehicule
{
public string Matriculation { get; set; }
}



public class Brand
{
public string Name { get; set; }
}
public class Renault : Brand
{
public string Information { get; set; }
}

void Main()
{
var car = new Car { Name = "Clio", Matriculation = "XXX-XXX", Brand = new Renault { Name = "Renault", Information = "Contact Infos" } };
var vehicle = car as Vehicule;

var serializer = new System.Xml.Serialization.XmlSerializer(typeof(Vehicule));

XmlWriterSettings settings = new XmlWriterSettings
{
Encoding = new UnicodeEncoding(false, false),
Indent = false,
OmitXmlDeclaration = false
};

using(StringWriter textWriter = new StringWriter())
using(XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings)) {
serializer.Serialize(xmlWriter, vehicle.Clone());
textWriter.ToString().Dump();
}
}

关于c# - 如何用派生类序列化基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25511505/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com