2012-11-07 4 views
0

사용자 지정 개체를 serialize하고 Windows 서비스로 보내야하는 응용 프로그램이 있습니다. 사용자 지정 개체에는 사용자 지정 개체 목록 2 개와 int, string 사전이 포함되어 있습니다. 나는 주위를 봤이 일반적으로 제대로 직렬화 설치되지 않는 데이터 유형 중 하나에 의한 것으로 나타났습니다목록/사전 직렬화

There was an error generating the XML document.

: 내가 객체를 직렬화하려고 할 때 오류 메시지가 무엇입니까. 그래서 나는 모든 사용자 정의 클래스에 대한 직렬화를 확인했으며 이것이 제대로 설정되었음을 알 수 있습니다.

지금 내 질문에 목록과 사전이 기본적으로 직렬화 가능합니까? 아니면 직렬화하기 위해 수행해야 할 사항이 있습니까? 또는 실행 파일간에 전달할 사용자 지정 개체 컬렉션을 serialize하는 더 좋은 방법이 있습니까?

편집 :

홈페이지 사용자 정의 클래스 :

[Serializable] 
class MoveInInfoRequest : ServerRequestData 
{ } 
[Serializable] 
[XmlInclude(typeof(GetUnitTypesResponseData)), XmlInclude(typeof(VendorObj.RequiredFields)), 
    XmlInclude(typeof(VendorObj.InsuranceChoice)), XmlInclude(typeof(VendorObj.ProrateSettings))] 
public class MoveInInfoResponse : ServerResponseData 
{ 
    public GetUnitTypesResponseData UnitTypesInfo 
    { get; set; } 
    public List<VendorObj.RequiredFields> RequiredFields 
    { get; set; } 
    public Dictionary<int, String> RentalPeriods 
    { get; set; } 
    public List<VendorObj.InsuranceChoice> InsCoverageAmounts 
    { get; set; } 
    public VendorObj.ProrateSettings ProrateOptions 
    { get; set; } 
} 

Sampple 하위 클래스 : 다른 두 클래스는 단지 더 이상 이와 유사한 설정되어 있지만, 그들은 단지 기본 데이터 유형을 사용합니다.

<Serializable(), DataContract([Namespace]:="*companyNamespace*")> _ 
Public Class InsuranceChoice 
    Public Sub New() 
    End Sub 
    <DataMember()> _ 
    Public InsuranceChoiceID As Integer 
    <DataMember()> _ 
    Public CoverageDescription As String 
    <DataMember()> _ 
    Public Premium As Decimal 
    <DataMember()> _ 
    Public ActualCoverageAmount As Decimal 

End Class 
+3

게시 코드 예, 대답 : 그들은 직렬화 있습니다 – Mihai

+0

을 받고 도움이 될 것이다. @Mihai가 말했듯이, 코드가 도움이 될 것입니다. – Yatrix

+0

List 및 Dictionary는 사용자가 수행 할 수있는 작업없이 serialize 할 수 있습니다. 분명히, 당신은 그렇지 않은 것, 그렇지 않은 것을 직렬화하는 것입니다. – LightStriker

답변

1

무엇을 직렬화하려고하는지에 따라 다릅니다. 특히 DataContractSerializer을 사용하는 경우에도 XmlSerializer을 사용하는 경우 사전 개체는 직렬화 할 수 없습니다. 목록을 직렬화하면됩니다.

Xml 직렬화에 대한 대안을 원하시면 Json.Net을 사용하여 JSON에 직렬화 할 수 있습니다.

참고 :이 직렬화에 관해서

Serialize Class containing Dictionary member

Serializing .NET dictionary

Why doesn't XmlSerializer support Dictionary?

http://theburningmonk.com/2010/05/net-tips-xml-serialize-or-deserialize-dictionary-in-csharp/

+0

에 의해서만 (?) 사용됩니다. 왜냐하면 새로운 클래스를 작성하는 대신에 rentperiods 객체를 잘라내려고했기 때문입니다. 링크를 가져 주셔서 감사합니다. 왜 그들이 문제가 발생했는지에 대해 훨씬 더 분명하게 밝혔습니다. –

1

이 매우 일반적인 문제입니다.

IDictionarycannot be serialized

당신은 IDictionary

의 예에서 상속하지 않습니다 자신의 사전 클래스를 생성하는 것 DataContractSerializer하지만, (내 생각에) 더 나은 솔루션을 사용할 수 있습니다 구현 모음 당신이 당신의 솔루션에 클래스를 구현하면 이러한 클래스가 here

을 찾을 수 있습니다, 간단하게이 작업을 수행 :

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var response = new MoveInInfoResponse 
      { 
       RentalPeriods = new SerializableDictionary<int, string> 
       { { 1, "Period 1" }, { 2, "Period 2" } } 
      }; 

      string xml = Serialize(response); 
     } 

     static string Serialize(Object obj) 
     { 
      var serializer = new XmlSerializer(obj.GetType()); 
      var settings = new XmlWriterSettings { Indent = true, OmitXmlDeclaration = true }; 

      using (var stream = new StringWriter()) 
      { 
       using (var writer = XmlWriter.Create(stream, settings)) 
        serializer.Serialize(writer, obj); 
       return stream.ToString(); 
      } 
     } 
    } 

    [Serializable] 
    public class MoveInInfoResponse 
    { 
     public SerializableDictionary<int, String> RentalPeriods 
     { get; set; } 
    } 
} 

는 다음과 같은 XML 파일을 생성합니다 :

<MoveInInfoResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <RentalPeriods> 
    <Item> 
     <Key> 
     <int>1</int> 
     </Key> 
     <Value> 
     <string>Period 1</string> 
     </Value> 
    </Item> 
    <Item> 
     <Key> 
     <int>2</int> 
     </Key> 
     <Value> 
     <string>Period 2</string> 
     </Value> 
    </Item> 
    </RentalPeriods> 
</MoveInInfoResponse> 
+0

해결해 주셔서 감사합니다. 이것은 미래에 유용 할 수 있습니다. 이 구현에서는 문제가되는 datamember가 고유 한 클래스가 될 수 있습니다. –