gpt4 book ai didi

c# - 确定 Object 的实例是否在 WCF 中是 DataContract 可序列化的

转载 作者:行者123 更新时间:2023-11-30 18:06:56 24 4
gpt4 key购买 nike

我正在阅读 reference page关于哪些类型可由 WCF 序列化,以及哪些类型自动为 KnownType 而哪些不是。任何人都可以阐明这一点吗?例如,如果我的 DataContract 有一个 Object 类型的成员,如果我传递一个字符串,它将很好地序列化,但如果我传递一个字典,则不会。字典需要一个 KnownType,尽管在该页面中被提及为受支持。有了这个我有两个问题:

  1. 那么问题是,WCF 始终使用的自动 KnowType 是什么?

  2. 我需要代码来判断对象实例是否默认为 KnownType。一种解决方案是从 1 的答案中得出一个详尽的列表,然后用“obj is type”语句检查每个对象,但这似乎是一个糟糕的实现。有没有更聪明的方法?

编辑:

reference列出默认已知的类型。所有基元减去 DateTimeOffset 加上 XmlElement。所以只剩下两个:我怎么知道一个对象是否是原始类型?

编辑 2:typeof(obj).IsPrimitive 将完成大部分工作!

最佳答案

当只有基类型在操作合约签名中可见但可以返回某些派生类型时,需要已知类型。示例:

[OperationContract]
BaseClass Foo();

并在实现中:

public Foo()
{
return DerivedClass();
}

其中 DerivedClass 派生自 BaseClass。因此,您需要在 BaseClass 声明中明确指定:

[KnownType(typeof(DerivedClass))]
[DataContract]
public class BaseClass { }

或使用 [ServiceKnownType]在服务契约(Contract)声明处:

[ServiceContract]
[ServiceKnownType(typeof(DerivedClass))]
public interface IService
{
[OperationContract]
BaseClass Foo();
}

或者使用配置文件:

<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="SomeNs.BaseClass, SomeAssembly">
<knownType type="SomeNs.DerivedClass, SomeAssembly"/>
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>

更新:

正如文档所述,对于原始类型你不需要这个:

The following types built into the .NET Framework can all be serialized and are considered to be primitive types: Byte, SByte, Int16, Int32, Int64, UInt16, UInt32, UInt64, Single, Double, Boolean, Char, Decimal, Object, and String.

关于c# - 确定 Object 的实例是否在 WCF 中是 DataContract 可序列化的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4355445/

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