gpt4 book ai didi

c# - 您如何知道何时通过 XML 序列化加载?

转载 作者:可可西里 更新时间:2023-11-01 07:54:17 25 4
gpt4 key购买 nike

我正在尝试通过 XML 序列化加载对象树,此时它将加载对象,并非常愉快地创建树。我的问题围绕着这些类支持一定程度的审计这一事实。我希望能够在每个对象完成加载后调用一些方法。

为了论证,假设我有一个相当通用的对象树,在不同级别有不同的类,例如:

 <Customer name="Foo Bar Inc.">
<Office IsHq="True">
<Street>123 Any Street</Street>
<Town name="Anytown">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
<Office IsHq="False">
<Street>456 High Street</Street>
<Town name="Anycity">
<State name="Anystate">
<Country name="My Country" />
</State>
</Town>
</Office>
</Customer>

有没有什么方法可以使用默认的序列化程序(类似于您可以创建类似 ShouldSerializeFoo 的方法)来确定每个对象的加载何时完成?

编辑:我应该指出,暴露类似于 OnLoaded() 方法的明显情况,我可以在反序列化后调用,这让我觉得是一件“坏事” .

编辑2:为了便于讨论,这是我当前的 hack “方法”,适用于基本级别,但子 City 节点仍然认为它需要保存更改(在现实世界中对象模型复杂得多,但这至少可以编译,不需要完整的源代码)

public class Office
{
[XmlAttribute("IsHq")]
public bool IsHeadquarters { get; set; }

[XmlElement]
public string Street { get; set; }

[XmlElement]
public Town Town { get; set; }

protected virtual void OnLoaded() {}

public static OfficeCollection Search()
{
OfficeCollection retval = new OfficeCollection();
string xmlString = @"
<Office IsHq='True'>
<Street>123 Any Street</Street>
<Town name='Anytown'>
<State name='Anystate'>
<Country name='My Country' />
</State>
</Town>
</Office>";

XmlSerializer xs = new XmlSerializer(retval.GetType());
XmlReader xr = new XmlTextReader(xmlString);
retval = (OfficeCollection)xs.Deserialize(xr);

foreach (Office thisOffice in retval)
{
thisOffice.OnLoaded();
}
return retval;
}
}

最佳答案

嗯...它仍然不漂亮,但您可以将反序列化逻辑重构到一个专用类中,该类可以在将反序列化对象返回给调用者之前通知它源自 XML。

更新:我认为这应该很容易做到,而且不会偏离框架设置的模式太远……您只需要确保使用 CustomXmlSerializer。需要这个通知的类只需要实现IXmlDeserializationCallback

using System.Xml.Serialization;

namespace Custom.Xml.Serialization
{
public interface IXmlDeserializationCallback
{
void OnXmlDeserialization(object sender);
}

public class CustomXmlSerializer : XmlSerializer
{
protected override object Deserialize(XmlSerializationReader reader)
{
var result = base.Deserialize(reader);

var deserializedCallback = result as IXmlDeserializationCallback;
if (deserializedCallback != null)
{
deserializedCallback.OnXmlDeserialization(this);
}

return result;
}
}
}

关于c# - 您如何知道何时通过 XML 序列化加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1266547/

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