【问题标题】:How to serialize an object containing an ILIST member into XML?如何将包含 ILIST 成员的对象序列化为 XML?
【发布时间】:2014-01-10 12:59:37
【问题描述】:

我正在尝试将具有多个字段的对象转换为 XML。问题是当它尝试序列化 ILIST 成员时出现异常。 以下是我正在使用的代码:

var stringwriter = new System.IO.StringWriter(); 
var serializer = new XmlSerializer(User.GetType()); <!-- Getting exception here -->
serializer.Serialize(stringwriter, User); 
return stringwriter.ToString();

我的用户看起来像这样:

class User
{       public virtual string Name{ get; set; }
        public virtual DateTime? LastUpdated { get; set; }

        public virtual int? ContactId { get; set; }

        public virtual IList<Sector> Sectors { get; set; }
        public virtual AccessLevel AccessLevel { get; set; }
        public virtual IList<UserRole> UserRole { get; set; }
}

有没有一种方法可以检查我正在序列化其对象的类的成员是否可序列化,然后调整该特定成员的逻辑。我对用户类的控制较少。 :( 所以我可以扩展我的代码来处理 IList 成员的任何方式都是首选。

【问题讨论】:

  • 尝试将User 类标记为serializable,为此添加SerializableAttribute
  • 异常信息是什么?
  • User 在你的代码中它和类和对象还是只有类?
  • 无法序列化类型为“System.Collections.IList”的成员“User.Sectors”
  • 虽然序列化 User 是一个实例而不是类。

标签: c# xml serialization


【解决方案1】:

旧式 XML 序列化无法处理接口 - 它需要具体类型。

但是,您可以使用较新的 DataContractSerializer 来做到这一点。

这是一个基于您的代码的示例:

using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.Serialization;
using System.Text;
using System.Xml;

namespace Demo
{
    [DataContract(Namespace = "")]
    public class User
    {
        [DataMember]
        public virtual string Name
        {
            get;
            set;
        }

        [DataMember]
        public virtual DateTime? LastUpdated
        {
            get;
            set;
        }

        [DataMember]
        public virtual int? ContactId
        {
            get;
            set;
        }

        [DataMember]
        public virtual IList<string> Sectors
        {
            get;
            set;
        }
    }

    internal class Program
    {
        private void run()
        {
            User user = new User();

            user.Sectors = new[] {"One", "Two", "Three"};
            user.Name = "Test Name";

            // Serialize

            var result = new StringBuilder();
            DataContractSerializer serializer = new DataContractSerializer(user.GetType());

            using (var stringWriter = new StringWriter(result))
            using (var xmlWriter    = XmlWriter.Create(stringWriter, new XmlWriterSettings { Indent = true } ))
            {
                serializer.WriteObject(xmlWriter, user);
            }

            string serialisedToString = result.ToString();

            Console.WriteLine(serialisedToString);

            // Deserialize

            using (var stringReader = new StringReader(serialisedToString))
            using (var xmlReader    = XmlReader.Create(stringReader))
            {
                user = (User) serializer.ReadObject(xmlReader);
            }

            Console.WriteLine(user.Name);
        }

        private static void Main()
        {
            new Program().run();
        }
    }
}

【讨论】:

  • 有没有一种方法可以检查我正在序列化其对象的类的成员是否可序列化,然后调整该特定成员的逻辑。我对用户类的控制较少。 :( 所以我可以扩展我的代码来处理 IList 成员的任何方式都是首选。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
  • 2015-10-02
  • 1970-01-01
  • 2011-12-03
  • 2019-03-04
  • 1970-01-01
相关资源
最近更新 更多