C# 由于序列化时动态添加名称空间,导致反序列化失败
我有一个我们序列化和反序列化的对象。在序列化对象时,我们动态添加名称空间,该名称空间作为属性不存在于类定义中。我创建了一个小示例来重复这个问题: 我有一门课,叫做Person:C# 由于序列化时动态添加名称空间,导致反序列化失败,c#,xml,serialization,xml-serialization,C#,Xml,Serialization,Xml Serialization,我有一个我们序列化和反序列化的对象。在序列化对象时,我们动态添加名称空间,该名称空间作为属性不存在于类定义中。我创建了一个小示例来重复这个问题: 我有一门课,叫做Person: [XmlRoot("person")] public class Person { [XmlIgnore] public DateTime? dob { get; set; } [XmlAttribute("dobs")] public DateTime dobser { get{ret
[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();
}
}
任何帮助都将不胜感激张贴的代码对我来说很好;我不得不发明自己的
GenerateStreamFromString
,但是:没有问题。您确定问题不是unicode/BOMs的问题吗
关于信息,我发明的方法是:
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));
}
(哪个更直接;开销更少)
最后请注意:您知道
不在该名称空间中,对吗?您的代码只是声明了一个从未使用过的别名。如果实际代码试图反序列化引用的名称空间中的
,那么是的:这不起作用(但是:问题中的代码并不是这样显示的)是的,它看起来有编码问题,两条注释都很有用,谢谢。我想记下你的答案。