不反序列化对象的一个实例
Doesn't deserialize one instance of an object
我有一个相当复杂的数据模型,它在 XML 之间进行序列化。我们都知道,当 C# 的 XmlSerializer 多次序列化对象的同一实例时,对象数据会重复。我遇到一个对象实例未反序列化的问题。例如,假设我们有三个对象:A、B、C。假设 A 包含 B 的两个实例,B 包含 C 的列表。
A
->B
->List<C> -- This one deserializes
->B
->List<C> -- This one does not
当我反序列化对象 A 时,B 的第一个实例正确反序列化。但是,当我检查 B 的第二个实例时, List<C>
是空的。我 运行 比较 XML 部分的差异,它们是相同的。
有谁知道为什么一个列表会反序列化而不是另一个列表?
更新
这是我能配对的最好的问题。原来的 XML 大约有 110,000 行。
类:
[Serializable]
public class A
{
public B instanceOne {get; set;}
public B instanceTwo {get; set;}
}
[Serializable]
public class B : INotifyPropertyChanged
{
private C _c;
public ObservableCollection<C> C
{
get => _c;
set
{
if(_c == value)
return;
_c = value;
RaisePropertyChanged(nameof(C));
}
}
//More Code
}
[Serializable, XmlRoot(ElementName = "MyC", Namespace = "MyNS")]
public class C
{
public int value {get;set;}
}
XML 输出:
<?xml version="1.0"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<InstanceOne>
<C>
<Value xmlns="MyNS">10</Value>
</C>
</InstanceOne>
<InstanceTwo>
<C>
<Value xmlns="MyNS">10</Value>
</C>
</InstanceTwo>
</A>
C#反序列化代码
XmlSerializer xml = new XmlSerializer(typeof(A));
using (FileStream fs = File.OpenRead(@"C:\a.xml"))
{
var t = xml.Deserialize(fs);
}
列表应具有适当的 XmlElement 属性和名称。
和空列表(没有元素被跳过)。它适用于多个层面。
我转载了这个:
[Serializable]
public class A
{
public A()
{
this.instanceOne = new B();
this.instanceTwo = new B();
}
public B instanceOne { get; set; }
public B instanceTwo { get; set; }
}
[Serializable]
public class B
{
public B()
{
this._c = new C();
this._c.value = 10;
}
private C _c;
}
[Serializable, XmlRoot(ElementName = "MyC", Namespace = "MyNS")]
public class C
{
public int value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var serializer = new XmlSerializer(typeof(A));
var a = new A();
try
{
var fs = new System.IO.FileStream("test.xml", System.IO.FileMode.Create);
serializer.Serialize(fs, a);
fs.Close();
A d = (A)serializer.Deserialize(new System.IO.FileStream("test.xml", System.IO.FileMode.Open));
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
我无法通过致电 XmlSerializer
解决手头的问题。我最终解析了文件,然后返回到 XML 和 XmlReader
以填补特定缺失的空白。
我有一个相当复杂的数据模型,它在 XML 之间进行序列化。我们都知道,当 C# 的 XmlSerializer 多次序列化对象的同一实例时,对象数据会重复。我遇到一个对象实例未反序列化的问题。例如,假设我们有三个对象:A、B、C。假设 A 包含 B 的两个实例,B 包含 C 的列表。
A
->B
->List<C> -- This one deserializes
->B
->List<C> -- This one does not
当我反序列化对象 A 时,B 的第一个实例正确反序列化。但是,当我检查 B 的第二个实例时, List<C>
是空的。我 运行 比较 XML 部分的差异,它们是相同的。
有谁知道为什么一个列表会反序列化而不是另一个列表?
更新
这是我能配对的最好的问题。原来的 XML 大约有 110,000 行。
类:
[Serializable]
public class A
{
public B instanceOne {get; set;}
public B instanceTwo {get; set;}
}
[Serializable]
public class B : INotifyPropertyChanged
{
private C _c;
public ObservableCollection<C> C
{
get => _c;
set
{
if(_c == value)
return;
_c = value;
RaisePropertyChanged(nameof(C));
}
}
//More Code
}
[Serializable, XmlRoot(ElementName = "MyC", Namespace = "MyNS")]
public class C
{
public int value {get;set;}
}
XML 输出:
<?xml version="1.0"?>
<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<InstanceOne>
<C>
<Value xmlns="MyNS">10</Value>
</C>
</InstanceOne>
<InstanceTwo>
<C>
<Value xmlns="MyNS">10</Value>
</C>
</InstanceTwo>
</A>
C#反序列化代码
XmlSerializer xml = new XmlSerializer(typeof(A));
using (FileStream fs = File.OpenRead(@"C:\a.xml"))
{
var t = xml.Deserialize(fs);
}
列表应具有适当的 XmlElement 属性和名称。 和空列表(没有元素被跳过)。它适用于多个层面。 我转载了这个:
[Serializable]
public class A
{
public A()
{
this.instanceOne = new B();
this.instanceTwo = new B();
}
public B instanceOne { get; set; }
public B instanceTwo { get; set; }
}
[Serializable]
public class B
{
public B()
{
this._c = new C();
this._c.value = 10;
}
private C _c;
}
[Serializable, XmlRoot(ElementName = "MyC", Namespace = "MyNS")]
public class C
{
public int value { get; set; }
}
class Program
{
static void Main(string[] args)
{
var serializer = new XmlSerializer(typeof(A));
var a = new A();
try
{
var fs = new System.IO.FileStream("test.xml", System.IO.FileMode.Create);
serializer.Serialize(fs, a);
fs.Close();
A d = (A)serializer.Deserialize(new System.IO.FileStream("test.xml", System.IO.FileMode.Open));
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
我无法通过致电 XmlSerializer
解决手头的问题。我最终解析了文件,然后返回到 XML 和 XmlReader
以填补特定缺失的空白。