2009-06-08 2 views
2

상황 :IDE에서 강력하게 명명 된 객체로 직렬화가 작동하지 않는 것 같습니다.

웹 서비스에 여러 비즈니스 객체가 있습니다. 모든 개체는 BusObjects.DLL에 캡슐화되어 있습니다. BusObjects.DLL은 서버의 GAC에 강력히 이름을 지정하고 서버에있는 다른 응용 프로그램도 액세스합니다.

나는 웹 서비스를 호출하는 일회용 클라이언트 응용 프로그램이 있습니다. 1 번 클릭 앱은이 BusObjects.DLL과 함께 제공됩니다.

웹 서비스가 클라이언트에 데이터를 반환하는 방식은 다음과 같습니다. 비즈니스 객체를 바이트 배열로 순차 나열하고이 바이트 배열을 클라이언트에 반환합니다. 클라이언트는 수신 된 바이트 배열을 비 직렬화하여 다시 비즈니스 객체로 만듭니다. 이는 클라이언트와 서버 코드가 모두 동일한 BusObjects.DLL에 대한 참조를 가지므로 가능합니다. 이 모든 것이 훌륭하게 작동합니다.

나를위한 문제는 이것입니다. 내가 VS2005 IDE에서합니다 (BusObjects 프로젝트를 포함) 클라이언트 솔루션을하면 코드

는 "파일 또는 어셈블리를로드 할 수 없습니다, 그것은 주장 때문에 비즈니스 오브젝트로 다시 바이트 배열을 직렬화 할 수없는 'CC.BusObjects, 버전 = 2.12.1.47, 문화 = 중립, PublicKeyToken = af56fdb58c626305'또는 해당 종속성 중 하나 위치한 곳 어셈블리의 매니페스트 정의가 가 어셈블리 참조와 일치하지 않습니다 HRESULT에서 (예외 :.. 0x80131040) "

일치하는 버전을 시도했지만 BusObjects 프로젝트가 외부 어셈블리가 아닌 프로젝트로 참조되는 경우 아무 것도 작동하지 않는 것 같습니다. 불행히도, 디버깅을 위해 솔루션 내에 BusObjects가 있어야합니다.

이 문제를 해결하려면 어떻게해야합니까? 나는 버전 리다이렉션에 대해 들었지만 강력한 어셈블리 이름으로는 작동하지 않는 것처럼 보일 수는 있지만 어쩌면 잘못하고있는 것일 수도있다.

public static byte[] ToBinary(Object objToBinary) 
    { 
     MemoryStream memStream = new MemoryStream(); 
     BinaryFormatter formatter = new BinaryFormatter(null, 
        new StreamingContext(StreamingContextStates.Clone)); 
     formatter.Serialize(memStream, objToBinary); 
     memStream.Seek(0, SeekOrigin.Begin); 
     return memStream.ToArray(); 
    } 


    public static object BinaryTo(byte[] objFromBinary) 
    { 
     MemoryStream ms = new MemoryStream(objFromBinary); 
     BinaryFormatter formatter = new BinaryFormatter(); 
     ms.Position = 0; 
     object obj = formatter.Deserialize(ms); 
     return obj; 
    } 

직렬화하려면 :

[WebMethod] 
public byte [] GetContacts() 
{ 
    return ToBinary(BusObjects.GetContacts()); 
} 

가 직렬화하려면 :

byte [] bts = ContactService.GetContacts(); 
List<Contact> lstContacts = (List<Contact>) BinaryTo(bts); 
+0

당신이뿐만 아니라 클라이언트 측에서 어셈블리를 서명하고 있습니까 하드 코딩 버전 번호를 가지고 속성 노드

  • 열기를 AssemblyInfo.cs
  • 변경 AssemblyVersion 속성을 확장?클라이언트 프로젝트에서 속성 -> 서명으로 이동하는 경우 서버 측에서 어셈블리 서명에 사용하는 것과 동일한 키를 사용합니까? –

  • +0

    음, 같은 프로젝트입니다. 그렇습니다. 같은 방식으로 서명되었습니다. – AngryHacker

    +0

    JP, 귀하의 초기 직감이 돈에 맞았습니다. 나는 가서 모든 빌드를하는 사람들에게 가서 보안상의 이유로 키를 사용하지 않고 자신의 키를 사용하고있는 것으로 나타났습니다. – AngryHacker

    답변

    2

    거의 확실하게 무슨 일이 버전 번호가 설정되어있다 여기에

    는 직렬화 및 역 직렬화 코드 빌드 프로세스 중에 자동으로 증가합니다. 이로 인해 종종 볼 수있는로드 문제가 발생할 수있는 버전 번호 시나리오가 하나씩 생깁니다.

    는 솔루션 탐색기에 다음

    • 이동을보십시오.
    관련 문제