创建 WCF 代理时数据协定未标记为可序列化

Posted

技术标签:

【中文标题】创建 WCF 代理时数据协定未标记为可序列化【英文标题】:Data Contract not marked as serializable while creating WCF proxy 【发布时间】:2020-05-06 11:51:35 【问题描述】:

我已将我的数据合约标记为可序列化,下面附上我的示例代码:

Imports System
Imports System.Runtime.Serialization
Imports System.Xml
Imports System.Xml.Serialization

<DataContract()>
<Serializable()>
Public Class USR_USER_CONTRACT
<DataMember()>
Public Property USR_USERID() As Global.System.String
<DataMember()>
Public Property USR_LOGINID() As Global.System.String
End Class

创建 WCF 代理类后,我的数据合同未标记为可序列化,如下所示:

<System.Diagnostics.DebuggerStepThroughAttribute(),
System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0"),
System.Runtime.Serialization.DataContractAttribute(Name:="USR_USER_CONTRACT", [Namespace]:="http://schemas.datacontract.org/2004/07/Ebix.Evolution.EntityContract")>
Partial Public Class USR_USER_CONTRACT
Inherits Object
Implements System.Runtime.Serialization.IExtensibleDataObject

Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject

Private CLM_BUDGETTIMEField As System.Nullable(Of Short)

Private PropertyUSR_DEFAULTASSFILESField As String

请帮忙。

谢谢

【问题讨论】:

为什么需要将其标记为可序列化? @tomredfern 因为我们需要实现 out proc session 模式,根据建议,在将 object 分配给 out proc session 类型时,对象应该是序列化形式。 如果一个类型是可序列化的,并不是因为使用了Serializable属性来装饰类型,而是因为该类型天生就是可序列化的。如果您的类型本质上是可序列化的,那么您不需要使用 Serializable 属性。 看这里***.com/questions/2595104/… 【参考方案1】:

在 WCF 中,默认类可以通过DataContractSerializer 进行序列化。因此,没有必要用Serializable 属性来装饰类。通常,在 WCF 中序列化一个类有两种方法。一种是DataContractSerializer,它要求数据类用DataContract修饰或不加任何修饰。另一种是XML序列化器,它要求我们在Operation ContractServiceContract上加上XmlSerializerFormatAttribute,然后我们可以使用XMLAttribute/XMlElementAttribute来控制序列化。

[ServiceContract,XmlSerializerFormat]
public interface IService

    [OperationContract]
    string Test(Product p);

public class Product

    public int Id  get; set; 
    public string Name  get; set; 

请参考官方文档https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-the-xmlserializer-classhttps://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts 如果有什么可以帮助的,请随时告诉我。

【讨论】:

以上是关于创建 WCF 代理时数据协定未标记为可序列化的主要内容,如果未能解决你的问题,请参考以下文章

从第三方 WCF 获取底层异常 - SOAP 异常

UserControl 集合未标记为可序列化

AppDomain CreateInstanceAndUnwrap:类型未标记为可序列化

类型“System.Web.HttpInputStream”未标记为可序列化

如何识别c__DisplayClass未标记为可序列化的位置

持久化未标记为可序列化的对象