이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 18725|회답: 0

[출처] 직렬화와 비직렬화에 관한 질문 하나

[링크 복사]
게시됨 2015. 10. 27. 오후 7:07:26 | | | |
어제 데이터베이스 동기화 테스트를 할 때 직렬화와 디직렬라이저리 기술을 조금 사용했습니다. 테이블의 필드를 Entity 클래스 DiagramInfo로 추상화한 후, 클라이언트의 새 레코드를 일반 컬렉션에 저장한 뒤, 이 일반 컬렉션을 직렬화하여 TCP를 통해 서버로 보내고, TCP가 이를 디직렬라이즈한 후 이 데이터를 데이터베이스에 씁니다. 아마도 이 작전의 과정이 바로 이런 방식일 것입니다.

       직렬화 저는 System.Runtime.Serialization.Iformatter 클래스를 사용해 일반 컬렉션을 이진 스트림으로 직렬화합니다. 일부 직렬화된 코드는 다음과 같습니다:

  1. private void Seriable(List diagrams)
  2.        {

  3.             MemoryStream stream = new MemoryStream();

  4.             IFormatter formater = new BinaryFormatter();

  5.             formater.Serialize(stream, diagrams);

  6.             stream.Flush();

  7.             serializedData = stream.ToArray();

  8.             stream.Close();

  9.         }
코드 복사
그 다음 TCP 프로토콜로 전송하는데, 이 부분은 생략됩니다.

서버는 데이터를 부분적으로 수신하여 메모리스트림으로 저장한 후 디직렬라이즈하며, 코드의 일부는 다음과 같습니다:
  1. do
  2. {

  3.       bytesRead = stream.Read(responseBuffer, 0, bufferSize);

  4.       memstream.Write(responseBuffer, 0, bytesRead);

  5. }

  6. while (bytesRead > 0);

  7. IFormatter formater = new BinaryFormatter();

  8. diagrams = (List)formater.Deserialize(memstream);

  9. stream.Close();

  10. memstream.Close();

  11. client.Close();
코드 복사
이 시점에서 클라이언트와 서버를 실행하여 데이터를 동기화하면 다음과 같은 오류 메시지가 나타납니다:
오류 동작: 다이어그램 = (리스트)포메이터. 디직렬라이즈(memstream);
말 그대로: 변환이 완료되기 전에 스트림의 끝을 만났습니다.
2. 해법구글 검색을 해보니 다음과 같은 오류 가능성에 답변이 나왔습니다:
1. 직렬화와 탈직렬화 유형이 다르며, 여기서는 제외할 수 있습니다;
2. 직렬화 중에 스트림을 지우는 버퍼가 없으며, Flush() 메서드는 사용되지 않아 여기서는 제외할 수 있습니다.
3. 디직렬화 전 수신 프로세스의 버퍼 크기가 충분하지 않을 수 있습니다. 저는 이 문제에 문제가 없을 것이라고 생각합니다. 디직렬라이징은 획득 스트림 후에 이루어지며, 버퍼 크기와는 무관할 것입니다. 개인적인 의견으로는 시도해보지 않았습니다;
4. 직렬 삭제 전에 덧셈스트렘. 위치=0。 (Stream은 디직렬라이즈할 스트림이며, 사실은 memstream입니다)
테스트해보니 네 번째 방법이 제 프로그램에도 맞을 것 같아요. 그렇다면 왜 이런 현상이 발생하는지, 디버깅 한 단계 후에 메모리 스트림을 관찰해 보세요. Postion의 값이 변하며, 쓰기 작업이 수행될 때마다 값이 끝을 가리키는 것으로 나타났습니다. 이것이 프로그램이 이러한 오류를 보고하는 이유를 설명합니다. 하지만 이해가 안 되는 건 왜 디직렬화 함수가 (디직렬라이즈) 전체 스트림을 기본적으로 디직렬화하는 대신, 포지톤이 있는 곳에서 시작해서 시작해야 합니다.





이전의:String[3]: Size 속성의 크기가 0입니다.
다음:VS2010 연결 서버 VSSS2005 시간 오류, 문제는 그림에 나와 같으니 신의 도움을 요청하세요
면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com