2012-10-09 7 views
2

DataContractJsonSerializer를 사용하여 대량 데이터를 직렬화하고 있지만 오류가 발생했습니다. 즉, 'System.OutOfMemoryException'유형의 예외가 발생했습니다.DataContractJsonSerializer를 사용하여 대량 데이터를 직렬화하는 방법은 무엇입니까?

public static string MyDataContractJsonSerializer(object objToSerialize, Type objType) 
{ 
     DataContractJsonSerializer ser = new DataContractJsonSerializer(objType); 
     System.IO.MemoryStream st1 = new System.IO.MemoryStream(); 
     ser.WriteObject(st1, objToSerialize); //Error encountering here.. Exception of type 'System.OutOfMemoryException' was thrown. 
     byte[] barray = st1.ToArray(); 
     string abc = System.Text.Encoding.ASCII.GetString(barray); 
     return abc; 
} 

이 문제를 어떻게 해결할 수 있습니까?

일괄 데이터를 직렬화하는 다른 방법을 알려주십시오.

도와주세요.

+2

직렬화 된 데이터로 무엇을하고 싶습니까? 파일에 저장 하시겠습니까? 전신환으로 보내시겠습니까? 다른 것? 나는 당신이 그것을 기억하고 싶다는 것을 매우 의심한다. 데이터가 큰 경우 문제가 발생할 수 있습니다. –

+0

자바 스크립트 (클라이언트 브라우저)로 보내려고합니다. –

+0

ajax를 사용하여 데이터베이스에서 데이터를 가져 오는 메시지를 보내고 응답을 원합니다. –

답변

0

직렬화 할 객체의 크기가 제한되지 않기 때문입니다.

큰 개체 인 경우 작은 덩어리로 나누어 하나씩 차례로 나열하는 것이 좋습니다.

+0

개체에 더 많은 구성원이 없어서 불가능합니다. 내 말은, 물체에는 두 명의 멤버 만 있습니다. obj.dataTb 및 obj.isSuccess. 및 길이 obj.dataTb가 초과되었습니다. –

+0

obj.dataTb를 청크로 분해 할 수 있으며 각 청크에는 여러 행이 포함되어 있습니다. – xing

+0

몇 개의 청크가 필요합니까? 내가 어떻게 결정할 수 있니? –

0

주석 섹션에서 직렬화 된 데이터를 클라이언트 브라우저 (javascript 클라이언트)로 보내겠다고 말했습니다. 이 경우 객체를 MemoryStream으로 직렬화하면 안됩니다. 그것은 쓸모없는 기억의 낭비입니다. ASP.NET 응용 프로그램 인 경우 개체를 Response.OutputStream에 직접 직렬화 할 수 있습니다.

예를 들어 당신의 방법은 다음과 같을 수 있습니다 : 다음

public static void MyDataContractJsonSerializer(
    object objToSerialize, 
    Type objType, 
    Stream output 
) 
{ 
    DataContractJsonSerializer ser = new DataContractJsonSerializer(objType); 
    ser.WriteObject(output, objToSerialize); 
} 

및 방법은 직접 응답 출력 스트림을 통과 호출 할 때.

public class MyHandler : IHttpHandler 
{ 
    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.ContentType = "application/json"; 

     var objToSerialize = ... 

     SerializerClass.MyDataContractJsonSerializer(
      objToSerialize, 
      objToSerialize.GetType(), 
      context.Response.OutputStream 
     ); 
    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
} 
+0

당신은 바로 선생님입니다. 문맥에서 직접 글을 쓸 수 있습니다. 그러나 ser.WriteObject (output, objToSerialize); "System.OutOfMemoryException '형식의 예외가 throw되었습니다. " 위의 해결 방법은 무엇입니까? –

+0

MemoryStream을 사용하지 않고 Response에 직접 쓰고 있어도 OutOfMemoryException을 얻고 있습니까? –

0

또한 스트림 (즉하여 FileStream)로 직렬화 할 수 있습니다 예를 들어, 당신은 일반적인 ASHX 처리기에서이 메서드를 호출하는 경우. 이 방법을 사용하면 OutOfMemory 예외 없이도 기가 바이트의 데이터를 직렬화 할 수 있습니다.

 public static void Serialize<T>(T obj, string path) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
      Stream stream = File.OpenWrite(path); 
      serializer.WriteObject(stream, obj); 
     } 

     public static T Deserialize<T>(string path) 
     { 
      DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T)); 
      Stream stream = File.OpenRead(path); 
      return (T)serializer.ReadObject(stream); 
     } 
관련 문제