2014-02-13 4 views
0

Я попытался следующий код:Не может сериализовать с помощью DataContractSerializer

PolicyProcessRequest.BranchCode = "HeadOff" 
PolicyProcessRequest.Policy.BranchCode = "HeadOff" 
PolicyProcessRequest.Policy.Risks.Item(0).BranchCode = "HeadOff" 

Dim dcs As DataContractSerializer = New DataContractSerializer(GetType(PureMessagingService.PolicyProcessRequestType)) 

Dim ms As New MemoryStream() 
dcs.WriteObject(ms, PolicyProcessRequest) 

Am получает следующее исключение при вызове WriteObject

System.Runtime.Serialization.SerializationException был пойман

HResult = -2146233076 Message = Member BranchCode в типе Sirius.SBO.Import.PureMessagingService.BaseRequestType не может быть сериализован. Это исключение обычно вызвано попыткой использовать нулевое значение, когда пустое значение недопустимо.

Члену «BranchCode» установлено значение по умолчанию (обычно это нуль или ноль). Параметр EmitDefault члена «false», указывая, что член не должен быть сериализован.

Однако параметр IsRequired участника является «истинным», что указывает на его сериализацию. Этот конфликт не может быть разрешен. Рассмотрим настройку «BranchCode» на значение, отличное от значения по умолчанию. В качестве альтернативы вы можете изменить свойство EmitDefaultValue атрибута DataMemberAttribute на true или изменить свойство IsRequired на false.

Тем не менее, я установил свойство «BranchCode» для значения без значения по умолчанию во всем запросе.

Public Class BaseNBQuoteRequestType 

     Private agentCodeField As String 

     Private branchCodeField As String 

     Private currencyCodeField As CurrencyType 

     Private currencyCodeFieldSpecified As Boolean 

     Private itemField As BasePartyType 

     Private policyField As BaseQuoteRiskMsgType 

     Private updatePartyField As Boolean 

     Public Property AgentCode() As String 
      Get 
       Return Me.agentCodeField 
      End Get 
      Set(ByVal value As String) 
       Me.agentCodeField = value 
      End Set 
     End Property 

     Public Property BranchCode() As String 
      Get 
       Return Me.branchCodeField 
      End Get 
      Set(ByVal value As String) 
       Me.branchCodeField = value 
      End Set 
     End Property 

     Public Property CurrencyCode() As CurrencyType 
      Get 
       Return Me.currencyCodeField 
      End Get 
      Set(ByVal value As CurrencyType) 
       Me.currencyCodeField = value 
      End Set 
     End Property 

     Public Property CurrencyCodeSpecified() As Boolean 
      Get 
       Return Me.currencyCodeFieldSpecified 
      End Get 
      Set(ByVal value As Boolean) 
       Me.currencyCodeFieldSpecified = value 
      End Set 
     End Property 

     Public Property Party() As BasePartyType 
      Get 
       Return Me.itemField 
      End Get 
      Set(ByVal value As BasePartyType) 
       Me.itemField = value 
      End Set 
     End Property 

     Public Property Policy() As BaseQuoteRiskMsgType 
      Get 
       Return Me.policyField 
      End Get 
      Set(ByVal value As BaseQuoteRiskMsgType) 
       Me.policyField = value 
      End Set 
     End Property 

    Public Property UpdateParty() As Boolean 
     Get 
      Return Me.updatePartyField 
     End Get 
     Set(ByVal value As Boolean) 
      Me.updatePartyField = value 
     End Set 
     End Property 
    End Class 
+0

Вы можете показать нам класс PolicyProcessRequestType? – Cybermaxs

+0

Добавлено определение класса в исходное сообщение. –

+0

it's BaseNBQuoteRequestType class not PolicyProcessRequestType class – Cybermaxs

ответ

0

У меня такая же проблема, и она исходит из DataContractSerializer, который используется для генерации кода. У меня есть другие службы, которые используют XmlSerializer без проблем.

К сожалению, при использовании Svcutil.exe или функции «Добавить служебную ссылку» в Visual Studio для генерации кода клиента для вас автоматически выбирается соответствующий сериализатор. Если схема не совместима с DataContractSerializer, выбирается XmlSerializer (source).

Итак, вы должны вручную исправить параметр IsRequired в ссылках.cs каждый раз, когда вы его создаете.

Заменить

IsRequired=true 

по

IsRequired=false 

в файле references.cs.

Смежные вопросы