-1

以下のようなデータコントラクトがあります。

[DataContract]
class Person
{
    private string m_name;
    [DataMember]
    public string Name
     { get {return m_name;}
       set {m_name = value;}
     }
}

xml シリアライザーがこのオブジェクトをシリアライズすると、次のようなプライベート メンバーを持つ xml が生成されます。

<person><m_name>john</m_name></person>

シリアライザーにパブリック プロパティのみをシリアル化させるにはどうすればよいですか。

前もって感謝します。

4

2 に答える 2

2

プライベート メンバーが xml に書き込むのは奇妙です。私はあなたの状況を模倣しようとしましたが、シリアライザーは public フィールドのみを書きました:

    【データ契約】
    公開クラス
    {
        プライベート文字列 m_name;
        [データメンバ]
        公開文字列名
        {
            get { return m_name; }
            set { m_name = 値; }
        }
    }

private void Form1_Load(object sender, EventArgs e) { var person = new Person() {Name = "john"}; var xs = new XmlSerializer(typeof(Person)); var sw = new StreamWriter(@"c:\person.xml"); xs.Serialize(sw, person); }

これも読むことができます:http://msdn.microsoft.com/en-us/library/83y7df3e%28VS.71%29.aspx

于 2013-03-28T02:55:21.910 に答える
1

DataContractSerializer代わりにXmlSerializer. これは、.NET 4.5 をターゲットとする VS 2012 で行われました。

テストコードは次のとおりです。

using Sytem;
using System.IO;
using System.Runtime.Serialization;

namespace ConsoleApplication1
{

    class Program
    {

        static void Main(string[] args)
        {

            Person myPerson = new Person() { Name = "Tim" };

            using (FileStream writer = new FileStream("Person.xml", FileMode.Create, FileAccess.Write))
            {

                DataContractSerializer dcs = new DataContractSerializer(typeof(Person));
                dcs.WriteObject(writer, myPerson);
            }
        }
    }

    [DataContract]
    class Person
    {

        private string m_name;

        public string Name
        {
            get
            {
                return m_name;
            }
            set
            {
                m_name = value;
            }
        }
    }
}

これを実行すると、次の XML が得られます。

<Person xmlns="http://schemas.datacontract.org/2004/07/ConsoleApplication1"
        xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
  <Name>Tim</Name>
<Person>

これが期待されるものです。

DataContractのデフォルトのシリアライザはDataContractSerializerではなく XmlSerializerであり、いくつかの違いがあることに注意することが重要です。でマークされたメンバーのみを[DataMember]シリアル化する必要があり、アクセス レベル (プライベート、パブリックなど) は関係ありません。プライベート フィールドまたはメンバーを でマークすると[DataMember]、シリアル化されます。

于 2013-03-28T06:33:21.410 に答える