2010-03-05 3 views
1

두 개의 서로 다른 응용 프로그램이 있으며 둘 사이에서 통신하기 위해 GroupLab Networking을 사용하고 있습니다. 아이디어는 공유 사전이 있고이 공유 사전에서 어떤 것이 바뀌면 다른 응용 프로그램이 알림을받습니다. 알림 부분이 작동합니다. 여기에 문제가있다. 첫 번째 응용 프로그램에는 다음 코드가 있습니다. TouchInfostruct입니다C# 응용 프로그램 간의 직렬화 된 개체 읽기

TouchInfo t = new TouchInfo(); 
int.TryParse(txtXCoord.Text, out t.X); 
int.TryParse(txtYCoord.Text, out t.Y); 
this.sharedDictionary1["/pointOne"] = t; 

. 공유 사전에 저장된이 오브젝트는 두 응용 프로그램에서 모두 액세스 할 수 있습니다. 코드는 다음과 같습니다 :이 코드는 개체를 만든 응용 프로그램에서 작동

TouchInfo val = (TouchInfo)this.sharedDictionary1["/pointOne"] 

동안. 나는 초에 다음과 같은 오류가 발생합니다 :

{Unserializable object: problem: System.Runtime.Serialization.SerializationException: Unable to find assembly 'NetworkingTestProgramOne, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

내가 직렬화도를 직렬화 프로그램의 어셈블리 정보를 저장하기 때문에이 문제가 실현. 그러나 나는 다른 프로그램에서 의사 소통을하기 위해 그것을 필요로한다. 이 작업을 어떻게 수행합니까?

답변

1

두 개의 다른 어셈블리에서 TouchInfo을 선언 했습니까? 이것은 나쁜 생각입니다. 두 응용 프로그램에 필요한 유형을 포함하는 하나의 공통 어셈블리가 있어야합니다.

저는 개인적으로 기본 .NET 이진 직렬화를 피하려고합니다. 더 많은 것을 제어 할 수있는 뭔가를 선호합니다. 여러 가지 이유로 Google 프로토콜 버퍼에 편향되어 있습니다. GroupLab 네트워킹 "일반"바이너리 직렬화가 필요합니까?

가능한 한 변경 가능한 구조체를 사용하지 않는 것이 좋습니다.

+0

안녕하세요, 전 본 적이 없습니다. 이것은 두 프로젝트의 프로젝트 속성에 들어가서 같은 "어셈블리 이름"이지만 다른 네임 스페이스를 갖도록 변경하는 것을 의미합니까? 공유 클래스 만 포함하고 어셈블리 이름을 같은 것으로 설정하는 세 번째 프로젝트 (클래스 라이브러리 프로젝트) 만들기? – Aishwar

+0

(aip.cd.aish에) "가변 구조체 사용을 피하려고"- 오, 공개 필드도 피하십시오 ('out t.X'는 public 필드입니다) –

+0

신경 쓰지 마세요. 알았다. 나는 새로운 클래스 라이브러리 프로젝트를 만들고 출력 dll을 가져 와서 두 프로젝트에 추가했습니다. – Aishwar

0

이전에는 SerializationBinder을 사용하여 요청한 유형을 현재 앱 도메인에서 사용할 수있는 유형으로 변환했습니다.

슬프게도 GroupLab.Networking에 대해 알지 못해서 직렬화를 수행하는 루틴을 액세스하거나 재정의 할 수 있는지 확실하지 않습니다.

대체 방법으로 AppDomain.CurrentDomain.AssemblyResolve 이벤트를 사용할 수 있습니다. 대리자를 할당하고이를 사용하여 형식을 포함하는 유효한 어셈블리로 리디렉션합니다.

1

두 응용 프로그램에서 공유하는 어셈블리에서 구조체를 선언해야합니다. 구조는 다음과 같아야합니다.

MyApp.Shared 
MyApp.ProgramOne 
MyApp.ProgramTwo 

두 프로그램 참조 공유. 그런 다음 적절하게 직렬화/역 직렬화 할 수 있습니다.

+0

감사합니다. 귀하의 답변이 도움이되었습니다. – Aishwar

관련 문제