0

カスタムオブジェクトをシリアル化してWindowsサービスに送信する必要があるアプリケーションがあります。カスタムオブジェクトには、カスタムオブジェクトの2つのリストと、int、stringの辞書が含まれています。オブジェクトをシリアル化しようとすると、エラーメッセージが表示されます。

There was an error generating the XML document.

グーグルで調べたところ、これは通常、データ型の1つがシリアル化用に正しく設定されていないことが原因であることがわかりました。だから私はすべてのカスタムクラスのシリアル化を調べて検証しました、そして私が知る限りそれは正しくセットアップされています。

私の質問は、リストと辞書はデフォルトでシリアル化できるのか、それともシリアル化するために何かをする必要があるのか​​ということです。または、実行可能ファイル間で渡されるカスタムオブジェクトのコレクションをシリアル化するためのより良い方法はありますか?

編集:

メインカスタムクラス:

[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 Subクラス:他の2つのクラスは、これと同じようにずっと長く設定されていますが、デフォルトのデータ型のみを使用しています。

<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
4

2 に答える 2

1

それはあなたがそれらをシリアル化しようとしているものに依存します。特に、を使用している場合、ディクショナリオブジェクトはシリアル化できませんが、を使用してXmlSerializerいる場合はシリアル化できますDataContractSerializer。リストをシリアル化しても問題ありません。

Xmlシリアル化の代替手段が必要な場合は、Json.Netを使用してJSONにシリアル化できます。

参照:

辞書メンバーを含むクラスをシリアル化する

.NET辞書のシリアル化

XmlSerializerが辞書をサポートしないのはなぜですか?

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

于 2012-11-07T20:41:03.433 に答える
1

これは、シリアル化に関しては非常に一般的な問題です。

コレクションの実装IDictionary はシリアル化できません

DataContractSerializerを使用することもできますが、(私の意見では)より良い解決策は、から継承しない独自の辞書クラスを作成することです。IDictionary

そのようなクラスの例はここにあります

ソリューションにクラスを実装したら、次のようにします。

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>
于 2012-11-07T20:58:43.590 に答える