상황 :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);
당신이뿐만 아니라 클라이언트 측에서 어셈블리를 서명하고 있습니까 하드 코딩 버전 번호를 가지고 속성 노드
음, 같은 프로젝트입니다. 그렇습니다. 같은 방식으로 서명되었습니다. – AngryHacker
JP, 귀하의 초기 직감이 돈에 맞았습니다. 나는 가서 모든 빌드를하는 사람들에게 가서 보안상의 이유로 키를 사용하지 않고 자신의 키를 사용하고있는 것으로 나타났습니다. – AngryHacker