어제 데이터베이스 동기화 테스트를 할 때 직렬화와 디직렬라이저리 기술을 조금 사용했습니다. 테이블의 필드를 Entity 클래스 DiagramInfo로 추상화한 후, 클라이언트의 새 레코드를 일반 컬렉션에 저장한 뒤, 이 일반 컬렉션을 직렬화하여 TCP를 통해 서버로 보내고, TCP가 이를 디직렬라이즈한 후 이 데이터를 데이터베이스에 씁니다. 아마도 이 작전의 과정이 바로 이런 방식일 것입니다.
직렬화 저는 System.Runtime.Serialization.Iformatter 클래스를 사용해 일반 컬렉션을 이진 스트림으로 직렬화합니다. 일부 직렬화된 코드는 다음과 같습니다:
- private void Seriable(List diagrams)
- {
- MemoryStream stream = new MemoryStream();
- IFormatter formater = new BinaryFormatter();
- formater.Serialize(stream, diagrams);
- stream.Flush();
- serializedData = stream.ToArray();
- stream.Close();
- }
코드 복사 그 다음 TCP 프로토콜로 전송하는데, 이 부분은 생략됩니다.
서버는 데이터를 부분적으로 수신하여 메모리스트림으로 저장한 후 디직렬라이즈하며, 코드의 일부는 다음과 같습니다:
- do
- {
- bytesRead = stream.Read(responseBuffer, 0, bufferSize);
- memstream.Write(responseBuffer, 0, bytesRead);
- }
- while (bytesRead > 0);
- IFormatter formater = new BinaryFormatter();
- diagrams = (List)formater.Deserialize(memstream);
- stream.Close();
- memstream.Close();
- client.Close();
코드 복사이 시점에서 클라이언트와 서버를 실행하여 데이터를 동기화하면 다음과 같은 오류 메시지가 나타납니다: 오류 동작: 다이어그램 = (리스트)포메이터. 디직렬라이즈(memstream); 말 그대로: 변환이 완료되기 전에 스트림의 끝을 만났습니다. 2. 해법구글 검색을 해보니 다음과 같은 오류 가능성에 답변이 나왔습니다:1. 직렬화와 탈직렬화 유형이 다르며, 여기서는 제외할 수 있습니다; 2. 직렬화 중에 스트림을 지우는 버퍼가 없으며, Flush() 메서드는 사용되지 않아 여기서는 제외할 수 있습니다. 3. 디직렬화 전 수신 프로세스의 버퍼 크기가 충분하지 않을 수 있습니다. 저는 이 문제에 문제가 없을 것이라고 생각합니다. 디직렬라이징은 획득 스트림 후에 이루어지며, 버퍼 크기와는 무관할 것입니다. 개인적인 의견으로는 시도해보지 않았습니다; 4. 직렬 삭제 전에 덧셈스트렘. 위치=0。 (Stream은 디직렬라이즈할 스트림이며, 사실은 memstream입니다) 테스트해보니 네 번째 방법이 제 프로그램에도 맞을 것 같아요. 그렇다면 왜 이런 현상이 발생하는지, 디버깅 한 단계 후에 메모리 스트림을 관찰해 보세요. Postion의 값이 변하며, 쓰기 작업이 수행될 때마다 값이 끝을 가리키는 것으로 나타났습니다. 이것이 프로그램이 이러한 오류를 보고하는 이유를 설명합니다. 하지만 이해가 안 되는 건 왜 디직렬화 함수가 (디직렬라이즈) 전체 스트림을 기본적으로 디직렬화하는 대신, 포지톤이 있는 곳에서 시작해서 시작해야 합니다.
|