DataContractSerializer的问题 [英] Problem with DataContractSerializer

查看:47
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆