2014-01-09 1 views
0

Remoting에서 WCF로 변환 중입니다. 내 코드에는 데이터 전송량을 최소화하기위한 최적화가 많이 포함되어 있으므로 ISerializable을 사용하고 있습니다. 업그레이드의 일환으로 내장 직렬화를 사용하는 것으로 변경하고 싶지는 않습니다. 작업이 완료되었으므로 계속 사용하고 싶습니다.WCF에는 추상 클래스에 ISerializable 생성자가 필요합니다.

WCF는 존중하고 내가 ISerializable 것으로 표시되며 추상 클래스 "열매"가 그러나 경우를 ISerializable을 사용하는 WCF는 불평 역 직렬화 할 시도 후 구체적인 클래스 사과, 바나나, 배 :

"생성자를 ISerializable 형식의 'fruit'에는 매개 변수 (SerializationInfo, StreamingContext)가 없습니다. "

비록 생성자가 필요하지 않습니다! 추상 클래스이며이 생성자는 하위 클래스 인 mybase.new (info, context)에서만 호출 할 수 있습니다. 그리고 내 하위 클래스는 그것을 요구하지 않습니다.

왜 결코 호출되지 않는 생성자를 주장합니까?

답변

0

"왜 주장하는거야?"하지만 나는 비슷한 문제 (다른 obj 정의를 보내기위한 추상 클래스를 만들어야 함)에 부딪혔다. 그리고 이것은 내가 생각해 낸 것이다. 와.

웹 서비스 (호스트 및 클라이언트)의 양쪽에 간단한 기본 클래스를 입력 및 출력 매개 변수로 사용합니다. 클래스에는 byte() 매개 변수와 문자열 매개 변수의 두 매개 변수 만있었습니다. 이 두 매개 변수를 기반으로 모든 텍스트 또는 숫자 데이터를 문자열 매개 변수 (xml)로 래핑하고 모든 바이트 데이터를이 클래스의 바이트 필드로 래핑하여 모든 상상 가능한 데이터 구조를 효율적으로 보낼 수있었습니다.

그리고이 "랩핑"이 프로그래밍되었으므로 웹 서비스 인터페이스를 변경하지 않고 호스트 간 또는 클라이언트에서 호스트로 무한 수의 서로 다른 데이터 객체를 보낼 수 있습니다 ... 데이터 및 작업 수업.

간단한 Ping() 함수에서 가장 복잡한 ResumeDownload() 함수에 이르기까지 웹 서비스에 노출 된 모든 "메서드"는이 기본 클래스를 사용하여 함수를 실행하는 데 필요한 바이트와 매개 변수를 보내고 결과.

내가 사용하는 기본 클래스 (VB에서 사면) 다음과 같습니다 :

Partial Public Class MessageStructure 
    Inherits Object 
    Implements System.Runtime.Serialization.IExtensibleDataObject, IDisposable 
    Private extensionDataField As System.Runtime.Serialization.ExtensionDataObject 
    Private BodySectionField() As Byte 
    Private TextSectionField As String 

    Public Property ExtensionData() As System.Runtime.Serialization.ExtensionDataObject Implements System.Runtime.Serialization.IExtensibleDataObject.ExtensionData 
     Get 
      Return Me.extensionDataField 
     End Get 
     Set(value As System.Runtime.Serialization.ExtensionDataObject) 
      Me.extensionDataField = value 
     End Set 
    End Property 

    <DataMember(Order:=1)> _ 
    Public Property BodySection() As Byte() 
     Get 
     Return Me.BodySectionField 
     End Get 
     Set(value As Byte()) 
     Me.BodySectionField = value 
     End Set 
    End Property 

    <DataMember(Order:=0)> _ 
    Public Property TextSection() As String 
     Get 
      Return Me.TextSectionField 
     End Get 
     Set(value As String) 
      Me.TextSectionField = value 
     End Set 
    End Property 

    Public Sub New(ByVal text As String, ByVal Bytes As Byte()) 
     BodySectionField = Bytes 
     TextSectionField = text 
    End Sub 
End Class 

는 희망이 당신을 도와줍니다.

관련 문제