gpt4 book ai didi

c# - WCF:通用接口(interface)的序列化是否可能?

转载 作者:太空狗 更新时间:2023-10-29 20:55:41 25 4
gpt4 key购买 nike

我正在尝试实现一个服务契约,其中包含一个采用通用接口(interface)的方法,并且该通用接口(interface)本身被赋予了一个接口(interface)参数。我用 ServiceKnownType 修饰了服务接口(interface),用常规 KnownType 修饰了服务实现,用常规 KnownType 修饰了数据契约(Contract)实现:

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ICallbacks))]
[ServiceKnownType(typeof(Batch<object>))]
[ServiceKnownType(typeof(Command))]
public interface IActions
{
[OperationContract]
IResponse TakeAction(IBatch<ICommand> commands);
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)]
[KnownType(typeof(Batch<object>))]
[KnownType(typeof(Command))]
internal class Actions : IActions
{
}

[DataContract]
[KnownType(typeof(Command))]
public class Batch<T> : IBatch<T>
{
}

为了记录,我在那里有 Batch,因为它似乎只能为泛型类型表达一次已知类型——它似乎发出 BatchOfanyType,但我不确定如何处理它。

我遇到的异常是“将任何未知类型静态添加到已知类型列表中 - 例如,通过使用 KnownTypeAttribute 属性或将它们添加到传递给 DataContractSerializer 的已知类型列表中。”

有什么明显的我做错了吗?只是不支持接口(interface)的通用接口(interface)吗?作为记录,我在这个项目上使用 C# 2.0 和 .NET 3.0。

最佳答案

如果您真的愿意,您可以在服务契约定义中使用接口(interface),只要您在执行操作时包括已知类型即可(稍作调整,见下文)。

显然,使用接口(interface)作为泛型类型参数对于 C# 3.0 来说太过分了。我将已知的类型属性更改为

[ServiceKnownType(typeof(Batch<Command>))]
public interface IActions
{
}

在某种程度上,这让它发挥了作用。序列化和反序列化本身可以工作,但是你会遇到这个异常:

Unable to cast object of type 'Batch`1[Command]' to type 'IBatch`1[ICommand]'.

要使该转换起作用,您需要对泛型类型协变的语言支持,这是在 C# 4.0 中引入的。不过,要使其在 C# 4.0 中工作,您需要添加一个方差修饰符:

public interface IBatch<out T>
{
}

然后它就完美地工作了......不幸的是你没有使用 C# 4.0。

关于在服务契约中使用接口(interface)的最后一件事:如果您从它们生成服务引用,它会将所有接口(interface)参数类型化为 object,因为原始接口(interface)类型不是元数据的一部分。您可以通过程序集引用共享契约,或手动重构生成的代理来修复它,但总而言之,使用 WCF 接口(interface)可能比它的值(value)更麻烦。

关于c# - WCF:通用接口(interface)的序列化是否可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337278/

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