Контракт данных не помечен как сериализуемый при создании прокси WCF

Я пометил свой контракт данных как сериализуемый, ниже я прилагаю свой образец кода:

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

Пожалуйста помоги.

Спасибо


person Wasif    schedule 20.01.2020    source источник
comment
Зачем вам нужно, чтобы он был помечен как сериализуемый?   -  person tom redfern    schedule 20.01.2020
comment
@tomredfern, поскольку нам нужно реализовать режим сеанса вне процедуры, и, согласно рекомендации, объект должен быть в форме сериализации при назначении объекта для типа сеанса процедуры.   -  person Wasif    schedule 20.01.2020
comment
Если тип сериализуемый, это не потому, что атрибут Serializable используется для украшения типа, а потому, что тип по своей сути сериализуем. Если ваш тип по своей сути является сериализуемым, вам не нужно использовать атрибут Serializable.   -  person tom redfern    schedule 20.01.2020
comment
См. Здесь stackoverflow.com/questions/2595104/   -  person tom redfern    schedule 20.01.2020


Ответы (1)


В WCF класс по умолчанию может быть сериализован с помощью DataContractSerializer. Следовательно, нет необходимости украшать класс атрибутом Serializable. Как правило, существует два способа сериализации класса в WCF. Один - DataContractSerializer, который требует, чтобы класс данных был украшен DataContract или без каких-либо украшений. Другой - сериализатор XML, он требует, чтобы мы добавили XmlSerializerFormatAttribute к Operation Contract или ServiceContract, а затем мы могли бы использовать 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-class
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/using-data-contracts
Не стесняйтесь, дайте мне знать, если я могу чем-то помочь.

person Abraham Qian    schedule 21.01.2020