3

私はこのアイデアを成功させずにグーグルとプロトタイピングを行ってきました。それが可能であることを確認したかったのです。WCF サーバークライアントをセットアップしました。

datacontracts と datamembers を持つオブジェクトがあります。クライアントで淡水化を行っています。メソッドもクライアントにあります。

    [Serializable]
    [DataContract (Namespace = "www.doesnotmatter.com")]
    [XmlRoot("home")]
    public partial class BaseModel
    {
        [DataMember(IsRequired = false)]
        public string prop1
        { get; set; }

        [DataMember(IsRequired = false)]
        public string prop2
        { get; set; }

        [DataMember(IsRequired=false)]
        public string prop3
        { get; set; }

      }

xml からオブジェクトに逆シリアル化しようとしていますが、以下のメソッドは私の関数です

public T FromXmlString<T>()
{
    var reader = new StringReader(xmlConfiguration);
    var serializer = new XmlSerializer(typeof(T), "www.doesnotmatter.com");
    var instance = (T)serializer.Deserialize(reader);
    reader.Dispose();
    return instance;
}

xmlは

   <home>
      <prop1>aaaaa</prop1>
      <prop2>bbbbb</prop2>
      <prop3>cccccc</prop3>
    </home>

エラーが発生し続けます

InnerException = {"<Task xmlns=''> was not expected."}

したがって、上記の XML を取得して、上記の BaseModel にデシリアライズしたいと考えています。編集:

ベース モデル オブジェクトはサーバー上にあり、私はクライアント上にいて、特定のオブジェクト (BaseModel) に逆シリアル化したい XML があります。xml からオブジェクトに正しく逆シリアル化できない名前空間の問題だと思いますが、よくわかりません。

問題が何であるか本当にわかりません。誰かがそれを見ることができますか?

4

2 に答える 2

2

シリアライザーの 2 番目のパラメーターを空の文字列に変更します。

var serializer = new XmlSerializer(typeof(BaseModel), "");

この単体テストは合格します:

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Xml.Serialization;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject1
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
            var xml = @"   <home>
      <prop1>aaaaa</prop1>
      <prop2>bbbbb</prop2>
      <prop3>cccccc</prop3>
    </home>";

            var reader = new StringReader(xml);
            var serializer = new XmlSerializer(typeof(BaseModel), "");
            var instance = (BaseModel)serializer.Deserialize(reader);

            Assert.AreEqual("aaaaa", instance.prop1);
            Assert.AreEqual("bbbbb", instance.prop2);
            Assert.AreEqual("cccccc", instance.prop3);
        }
    }

    [Serializable]
    [DataContract(Namespace = "www.doesnotmatter.com")]
    [XmlRoot("home")]
    public partial class BaseModel
    {
        [DataMember(IsRequired = false)]
        public string prop1
        { get; set; }

        [DataMember(IsRequired = false)]
        public string prop2
        { get; set; }

        [DataMember(IsRequired = false)]
        public string prop3
        { get; set; }
    }
}
于 2012-09-07T15:49:01.820 に答える
0

クラスにすでにXMLルートがあり、正しくオーバーライドできていない可能性があります。情報が少ないのでわかりにくいです。

試す

var serializer = new XmlSerializer(typeof(T), new XmlRootAttribute("home"));
于 2012-09-07T16:01:57.517 に答える