1

シリアル化および逆シリアル化するオブジェクトがあります。オブジェクトをシリアル化する際に、クラス定義に属性として存在しない名前空間を動的に追加します。ここで問題を繰り返すために小さな例を作成しました:

Person というクラスがあります。

[XmlRoot("person")]
public class Person
{
    [XmlIgnore]
    public DateTime? dob { get; set; }

    [XmlAttribute("dobs")]
    public DateTime dobser { get{return dob.Value;} set{dob=value;} }

    public bool ShouldSerializedobser()
    {
        return dob.HasValue;
    }

    [XmlAttribute("name")]
    public string Name { get; set; }

    public bool ShouldSerializeName()
    {
        return !string.IsNullOrWhiteSpace(Name);
    }

    public int? Age { get; set; }

}

そしてここでコードはシリアライズとデシリアライズを行います

public class Program
{
    static void Main(string[] args)
    {
         var person = new Person();
         person.Age = 12;
         StringBuilder sb = new StringBuilder();
         StringWriter sw = new StringWriter(sb);
         //add namespace
         XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces();
         namespaces.Add("ns1", "http://www.microsoft.com/schema/ml/v1");
         XmlSerializer xs = new XmlSerializer(typeof(Person));
         xs.Serialize(sw, person,namespaces);

         // try to deserialize, it fails. It is working If I don't add namespace
         xs.Deserialize(GenerateStreamFromString(sb.ToString()));

         Console.WriteLine(sb.ToString());
         Console.Read();
    }
 }

どんな助けでも大歓迎です

4

1 に答える 1

2

投稿されたコードは私にとってはうまくいきます。私は自分自身を発明しなければなりGenerateStreamFromStringませんでしたが、問題はありません。問題は unicode や BOM の問題ではありませんか?

情報については、私の発明した方法は次のとおりです。

private static Stream GenerateStreamFromString(string value)
{
    return new MemoryStream(Encoding.Unicode.GetBytes(value));
}

実際には私は好むでしょう:

private static XmlReader GenerateReaderFromString(string value)
{
    return XmlReader.Create(new StringReader(value));
}

(より直接的で、オーバーヘッドが少ない)

最後の注意として、それがその名前空間にないことはわかっています<person>? あなたのコードは、決して使用されないエイリアスを宣言しているだけです。実際のコードが引用された名前空間でa を逆シリアル化しようとしている場合、はい: それは機能しません (ただし: 問題のコードが示すものではありません)。<person>

于 2013-10-28T11:33:13.773 に答える