【问题标题】:Failing Deserialization due to dynamically added namespaces on serialization由于在序列化时动态添加命名空间而导致反序列化失败
【发布时间】:2013-10-28 11:11:54
【问题描述】:

我有一个我们序列化和反序列化的对象。在序列化对象时,我们动态添加名称空间,该名称空间在类定义中不存在作为属性。我在这里创建了一个小例子来重复这个问题:

我有一个类,叫做 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();
    }
 }

任何帮助将不胜感激

【问题讨论】:

  • 是的,它看起来编码问题,两个评论都很有用,谢谢。我想标记你的答案。

标签: c# xml serialization xml-serialization


【解决方案1】:

发布的代码对我来说很好;我不得不发明自己的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> 不是那个命名空间,对吧?您的代码只是声明了一个从未使用过的别名。如果实际代码试图反序列化<person>在引用的命名空间,那么是的:那行不通(但是:这不是问题展示)

【讨论】:

    猜你喜欢
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-12
    • 2011-10-30
    相关资源
    最近更新 更多