1

次のシナリオがあり、解決策が見つかりません。

ツールを使用して生成された複数のデータ コントラクト プロキシがありsvcutil.exeます。object[]データ コントラクト プロキシ インスタンスを含むインスタンスをシリアル化しようとしています。以下を試しました:

public static string Serialize<T>(T obj)
{
   StringBuilder sb = new StringBuilder();
   var known = new List<Type>(){typeof(myDataContracClass), typeof(object[])};
   DataContractSerializer ser = new DataContractSerializer(typeof(T), known );
   ser.WriteObject(XmlWriter.Create(sb), obj);
   return sb.ToString();
}

そして、それを次のように使用します。

object[] arrayToSerialize = new object[] { someGuid, myDatacontractProxyInstance};
var serialized = Serialize(arrayToSerialize);

編集:(私のセットアップをさらに説明するために)

次のデータ コントラクト属性を配置しました。

[DataContract(Namespace = "http://mynamespace-uri")]

svcutil.exe のプロキシ生成で、名前空間を宣言しまし/n:*,My.Custom.Namespaceた。これにより、生成されたプロキシがデータ コントラクト クラスとは異なる名前空間を持つようになります。

オフトピック: なぜ Microsoft は非常に難しいシリアライゼーション コンポーネントに行き着いたのですか?

4

1 に答える 1

1

DataContractClass をattributesで装飾することにより、DataContractSerializer ヒントを提供します。

これを試して:

[TestFixture]
public class DataContractSerializerTests
{
    [Test]
    public void ArrayOfObjectsTest()
    {
        var dataContracClass = new DataContractClass() 
            { 
               Objects = new object[] { "Johan", 1 } 
            };
        StringBuilder sb = new StringBuilder();
        DataContractSerializer ser = new DataContractSerializer(dataContracClass.GetType());

        using (XmlWriter xmlWriter = XmlWriter.Create(sb))
        {
            ser.WriteObject(xmlWriter,dataContracClass);
        }
        string s = sb.ToString();
    }
}

以下は、クラスのシリアル化方法を指定する属性を持つクラスです。

[DataContract]
public class DataContractClass
{
    [DataMember]
    public object[] Objects { get; set; }
}
于 2012-10-31T11:45:38.947 に答える