2013-03-18 3 views
3

WCF 서비스를 통해 사용자 지정 개체의 목록을 역 직렬화하려는로드 블록을 실제로 봤습니다. 그것은 .NET 4를 사용하고 있습니다. 다른 네임 스페이스를 사용하려면 어떻게해야합니까? 내 ASP.NET 응용 프로그램이 3.5에서 실행 중이며 참조 설정이 정상입니다. 그게 문제일까요? 어떻게해야합니까?사용자 지정 개체 목록을 비 직렬화하는 방법

내 서비스를 다음과 같이 설정

:

계약

namespace MyDomain.Services.Report 
{ 
    [ServiceContract(Name = "ICompanyReport")] 
    public interface ICompanyReport 
    { 
     [OperationContract] 
     byte[] GetFooReport(string fooName); 
    } 

    [Serializable] 
    [DataContract(Name="FooReportRecord", Namespace="MyDomain.com"] 
    public class FooReportRecord 
    { 
     [DataMember] 
     public int ID {get; set;} 
     [DataMember] 
     public string Name {get; set;} 
    } 

} 

svc.cs

public class CompanyReport: ICompanyReport 
{ 
    public byte[] GetFooReport(string fooName) 
    { 
     var data = new List<FooReportRecord>(); 

     // get data based on fooName and populate data 

     var ms = new MemoryStream(); 
     var bf = new BinaryFormatter(); 
     bf.Serialize(ms, data); 
     return ms.ToArray(); 
    } 
} 

클라이언트 측 :

var ls = proxy.GetFooReport("bar"); 
var bf = new BinaryFormatter(); 
var ms = new MemoryStream(ls); 

// Unable to find assembly MyDomain.Services.Report error is thrown 
var reportData = (List<FooReportRecord>)bf.Deserialize(ms); 
+2

왜 FooReportRecord가 아닌 byte []가 반환됩니까? – Phil

+0

"내 ASP.NET 응용 프로그램이 3.5에서 실행 중"이라면 ASP.NET 웹 사이트에서 호스팅되는 WCF 서비스가 무엇입니까? 또는 ASP.NET 응용 프로그램이 클라이언트입니까? 나는 여기서 클라이언트를 의미하는 것 같아요. – EdmundYeung99

+0

바이트 []는 가능한 한 객체 목록을 줄이려고 시도했습니다. 테스트 할 때 바이트 배열과 실제 목록을 사용하여 더 많은 결과를 얻을 수있었습니다. – HapiDjus

답변

1

클라이언트가 .NET 3.5 응용 프로그램이고 FooReportRecord가 .NET 4 wcf 라이브러리에 있다고 가정하면 컴파일 시간 오류가 발생합니다. 제 3 클래스 라이브러리에

이동 FooReportRecord는 WCF 응용 프로그램 및 클라이언트 (ASP.NET)

에서 모두 .NET 3.5과 기준이 컴파일하지만 @Phil가 언급 한 바와 같이, 왜 FooReportRecord [] 반환하는 대신 바이트하지 []

서비스

public FooReportRecord[] GetFooReport(string fooName) 
{ 
    var data = new List<FooReportRecord>(); 

    // get data based on fooName and populate data 

    return data.ToArray(); 
} 

클라이언트

,174,
var proxy = new ServiceReference1.CompanyReportClient(); 
FooReportRecord[] ls = proxy.GetFooReport("bar"); 
+0

하루 종일보고 나서 내보고 서비스를 4.0으로 끌어 올리는 내 모든 이유를 버렸습니다. 반환되는 목록의 크기가 너무 커서 일부 해커 간 버전 역 직렬화를 시도하지 않았습니다. "왜 바이트 []"라는 것이 나에게 똑같은 질문을하는 것을 보았을 때까지는 아니었다. 도와 주셔서 감사합니다! – HapiDjus