我试图提出一个解决方法,该解决方法可以容纳抽象基类的构造函数,当客户消耗我的WCF服务的客户端在DataConaltract对象上执行new()
。我知道数据合同对象是作为原始的,非初始化的对象创建的,因此没有调用构造函数。我遇到了 [OnSerializing]
, [OnSerialized]
, [OnDeserializing]
和 [OnDeserialized]
属性的用户,除非您明确迫使它使用XML,否则我发现它们不会被WCF的序列化引擎所兑现,在这种特定情况下是不希望的。这是我要使用的非常简单的编码示例。
[DataContract(Namespace = "http://somenamespace/Data/ContractBase/v1")]
public abstract ContractBase
{
[DataMember(IsRequired = true)]
public SomeDataContract BaseClassObject { get; set; }
public string Name { get; set; }
public ContractBase()
{
BaseClassObject = new SomeDataContract("randomConstructorArgument");
Name = "Ezra";
}
}
[DataContract(Namespace = "http://somenamespace/Data/TheClass/v1")]
[KnownType(typeof(ContractBase))]
public sealed class TheClass : ContractBase
{
[DataMember]
public PetDataContract MyPet { get; set; }
[DataMember]
public int SomeIntProperty { get; set; }
public TheClass()
: base()
{
MyPet = new PetDataContract ("Fido");
SomeIntProperty = -1;
}
}
我知道,执行TheClass myClass = new TheClass();
的客户端不会初始化基本构造函数,因为TheClass
的构造函数从未被调用。我试图添加诸如序列化发生时触发以下方法毫无成功时触发的方法。
private void Initialize()
{
MyPet = new PetDataContract ("Fido");
SomeIntProperty = -1;
base.Initialize();
}
[OnSerializing]
private void OnSerializing(StreamingContext c)
{
Initialize();
}
基类也将具有初始化方法,以便将"构造函数"链接。构造函数本身将被更新以包括Initialize();
调用以使用相同的常见代码源。
是否有一种方法可以处理此操作,而不会强迫通过XmlSerializer
进行序列化?我当前的解决方法是在WCF服务中提供一种方法来创建服务器上的对象并返回后构造者版本。
public TheClass CreateTheClass(TheClass contract)
{
// Calls the constructor of TheClass and its base constructor.
return new TheClass();
}
这确实可以按预期工作,但是由于网络I/O成本,这是一个额外的服务电话。任何帮助都将不胜感激。
谢谢!
根据本文,您提到的属性应与DataContractSerializer
合作。您的最后一个示例有些奇怪 - 您正在尝试使用OnSerializing
属性,同时说WCF期间未调用构造函数。
我建议将您的方法与OnDeserializing
标记的Initialize
方法(或OnDeserialized
(如果您希望完成后)调用代码)属性。