当客户端在DataContract上调用新的新调用时,如何初始化抽象基础构造函数



我试图提出一个解决方法,该解决方法可以容纳抽象基类的构造函数,当客户消耗我的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(如果您希望完成后)调用代码)属性。

最新更新