我在将信息反序列化为单例类时遇到了一些问题。
这是我目前的设置:
[XmlRoot("Root")]
public class SerializeTwoClasses
{
ClassA _classA = ClassA.ClassAInstance;
ClassB _classB = ClassB.ClassBInstance;
public ClassA ClassAProp { get { return _classA; } set { _classA = value; } }
public ClassB ClassBProp { get { return _classB; } set { _classB = value; } }
}
[XmlRoot("ClassARoot")]
public class ClassA
{
static private ClassA _classA;
static public ClassA ClassAInstance
{
get
{
if(_classA == null)
_classA = new ClassA();
return _classA;
}
}
public int Id { get; set; }
public string Value { get; set; }
public Address Address { get; set; }
}
[XmlRoot("ClassBRoot")]
public class ClassB
{
static private ClassB _classB;
static public ClassB ClassBInstance
{
get
{
if(_classB == null)
_classB = new ClassB();
return _classB;
}
}
public int IdAndereClasse { get; set; }
public string ValueAndereClasse { get; set; }
}
这是我设置值和序列化的方法。
SerializeTwoClasses _serializeTwoClasses = new SerializeTwoClasses();
_serializeTwoClasses.ClassBProp = new ClassB { IdAndereClasse = 753951, ValueAndereClasse = "Olla" };
_serializeTwoClasses.ClassAProp.Id = 789456;
_serializeTwoClasses.ClassAProp.Value = "The Title yo";
_serializeTwoClasses.ClassAProp.Address = new Address { City = "Amsterdam", HouseNo = 1, StreetName = "Some Street" };
var serializer = new XmlSerializer(typeof(SerializeTwoClasses));
var fileStream = new System.IO.StreamWriter("serialized.config");
serializer.Serialize(fileStream, _serializeTwoClasses);
fileStream.Close();
文件中的输出是:
<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<ClassAProp>
<Id>789456</Id>
<Value>The Title yo</Value>
<Address>
<HouseNo>1</HouseNo>
<StreetName>Some Street</StreetName>
<City>Amsterdam</City>
</Address>
</ClassAProp>
<ClassBProp>
<IdAndereClasse>753951</IdAndereClasse>
<ValueAndereClasse>Olla</ValueAndereClasse>
</ClassBProp>
</Root>
现在我想将文件中的信息反序列化为类,并尝试这样:
SerializeTwoClasses _serializeTwoClasses = new SerializeTwoClasses();
XmlSerializer deserializer = new XmlSerializer(typeof(SerializeTwoClasses));
TextReader reader = new StreamReader("serialized.config");
object obj = deserializer.Deserialize(reader);
_serializeTwoClasses = (SerializeTwoClasses)obj;
reader.Close();
当我检查_serializeTwoClasses对象时,我可以看到_ClassA和_ClassB属性,它们代表在serialized.config文件中设置的值。 但是......虽然类ClassA和ClassB仅被引用通过单例方法创建&lt;我希望这两个类都能填充文件中的值。但他们不是......
在我的表单类中(我通过按钮触发上面的序列化和反序列化方法)我在类中有这些字段:
ClassA _classA = ClassA.ClassAInstance;
ClassB _classB = ClassB.ClassBInstance;
(在序列化和反序列化之前设置) 并且这两个类的内容表示属性的默认值(0,null等)。 我在俯视什么?
顺便说一句:由于框架中的设置,属性类需要是单例类。 亲切的问候,
Matthijs
答案 0 :(得分:1)
你的类型不是真正的单身人士;它们是具有默认实例的类型。反序列化步骤创建了第二个完全独立的实例。您可以查看,例如:
bool areSame = ReferenceEquals(
_serializeTwoClasses.ClassAProp, ClassA.ClassAInstance);
我希望false
。