2009-07-16 3 views
2

이것은 C# 3.0 Winform 문제입니다.MemoryStream의 Deserialize가 C#의 OutOfMemory 예외를 throw합니다.

큰 (실제로는 크지 않은) 복잡한 개체를 복제하려고합니다. 느리게 그것을하기 위해, 나는 그것을 MemoryStream에 seralize하고 BinaryFormatter.UnsafeDeserialize (MemoryStream, null) 메소드를 사용하여 복제 된 객체를 얻는다. UnsafeDeserialize() 메서드에는 항상 OutOfMemory 예외가 throw됩니다. 메모리가 충분해야합니다.

.net 버그로 약간 읽었지만 여기에 있는지 여부는 확실하지 않습니다.

누구에게 이런 일이 발생했는지 알 수 있습니까? 어떤 workaround? 감사.

+4

실제 코드를 게시 할 수 있습니까? –

+0

(의견에 회신) –

답변

2

아마도 어리석은 질문이지만 메모리 스트림을 역 직렬화하기 전에 스트림의 시작 부분으로 되감기를 기억하고 있습니까?

일부 코드를 공유하는 데 도움이 될 수도 있습니다.

+0

예, 역 직렬화하기 전에 위치를 0으로 설정했습니다. – Steve

1

Deserialize 대신 UnsafeDeserialize을 사용하는 이유는 무엇입니까?

+0

MSDN에서 : "완전 신뢰 시나리오에서 UnsafeDeserialize는 Deserialize보다 우수한 성능을 제공합니다." –

+0

Didnt는 그것을 알고있다! :) 내 물건을 위해 지금 그것을 할! (비록 나는 그것이 이미 더 빠르다는 것을 알지만). – leppie

1

개체는 무엇이며 크기는 얼마나됩니까?

나는 비슷한 문제를 가진 다른 사람들을 보았고 어떤 경우에는 다른 serializer로 전환하여 문제를 해결했습니다. 시나리오에 따라 여러 가지를 제안 할 수 있습니다. 특히 - 데이터가 트리 또는 그래프입니까? (즉, 자식 객체는 형제 또는 부모를 지칭합니까? 아니면 자신의 자식 만 참조 할 수 있습니까?)

+0

클래스는 트리 구조입니다. – Steve

+0

그러면 protobuf-net을 고려해보십시오. 그것은 빠르고 효율적인 (공간적으로) 이진 트리 시리얼 라이저입니다. 기존 BinaryFormatter 직렬화 된 데이터와 호환되지 않습니다. 주의 사항 : 나는 저자이지만 무료입니다. 나는 너에게 아무것도 팔려고하지 않을거야. –

0

대신 FileStream을 시도하고 파일 크기를 확인하는 것이 좋습니다.

+0

나는 그것을 시도했다. 파일은 단지 58MB입니다. 그래서 전혀 메모리 문제가 없어야합니다. OutOfMemory 예외가 발생하면 응용 프로그램은 500MB 미만 만 사용합니다. 나는 4G 메모리를 가지고 있으며, 단일 .net 어플리케이션은 최대 2G 메모리를 사용한다고 가정 할 것이다. – Steve

관련 문제