DataContractSerializer的问题 [英] Problem with DataContractSerializer
问题描述
大家好,
我的代码:
using System;
using System.IO;
using System.Xml;
using System.Text;
using System.Runtime.Serialization;
using System.Collections.ObjectModel;
namespace SerializerDemo
{
public class Program
{
private static ObservableCollection<Company> companies = new ObservableCollection<Company>();
private static void Read()
{
string text;
text = File.ReadAllText("TEST.xml");
using (Stream stream = new MemoryStream())
{
byte[] bytes = Encoding.UTF8.GetBytes(text);
stream.Write(bytes, 0, bytes.Length);
stream.Position = 0;
DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<Company>));
companies = (ObservableCollection<Company>)serializer.ReadObject(stream);
}
}
private static void Write()
{
string text;
Company company = new Company() { Name = "1" };
company.Employees = new ObservableCollection<Employee>();
Employee employee = new Employee() { Name = "Stefano", Eta = "43" };
company.Employees.Add(employee);
employee = new Employee() { Name = "Alessio", Eta = "8" };
company.Employees.Add(employee);
companies.Add(company);
DataContractSerializer serializer = new DataContractSerializer(typeof(ObservableCollection<Company>));
using (var ms = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(ms, new XmlWriterSettings { Indent = true }))
{
serializer.WriteObject(xmlWriter, companies);
}
ms.Seek(0, SeekOrigin.Begin);
using (StreamReader reader = new StreamReader(ms))
{
text = reader.ReadToEnd();
}
File.WriteAllText("TEST.xml", text);
}
}
static void Main(string[] args)
{
Write();
//Read();
}
}
[Serializable]
public class Company
{
private ObservableCollection<Employee> employees;
public ObservableCollection<Employee> Employees
{
get { return employees; }
set
{
employees = value;
}
}
public string Name;
public int EmployeesNumber;
}
[Serializable]
public class Employee
{
public string Name;
public string Eta;
//public string Phone;
//[OnDeserializing]
//private void setDefaultPhone(StreamingContext c)
//{
// Phone = "123";
//}
}
}
生成此XML文件:
<?xml version="1.0" encoding="utf-8"?>
<ArrayOfCompany xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/SerializerDemo">
<Company>
<EmployeesNumber>0</EmployeesNumber>
<Name>1</Name>
<employees>
<Employee>
<Eta>43</Eta>
<Name>Stefano</Name>
</Employee>
<Employee>
<Eta>8</Eta>
<Name>Alessio</Name>
</Employee>
</employees>
</Company>
</ArrayOfCompany>
如果您取消对Employee类和主注释中的Phone和setDefaultPhone的注释,则写入和取消注释读取序列化过程将失败.为什么?
if you uncomment Phone and setDefaultPhone in Employee class and in Main comment Write and uncomment Read serialization process failed. Why ?
我的目标是在Employee类中添加新成员后,读取此XML文件(不更改写入过程).
My objective is Read this XML file (without change Write procedure) after add a new member in Employee class.
推荐答案
在公用字符串Phone中添加[OptionalField]应该可以解决此问题.
Adding [OptionalField] to public string Phone should fix this.
或者,从[Serializable]切换到[DataContract],然后将[DataMember]添加到每个字段;然后,DataMemberAttribute.IsRequired将默认为false.
Alternatively, switch from [Serializable] to [DataContract] and add [DataMember] to each field; DataMemberAttribute.IsRequired would then default to false.
这篇关于DataContractSerializer的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!