C# 如何将包含ILIST成员的对象序列化为XML?

C# 如何将包含ILIST成员的对象序列化为XML?,c#,xml,serialization,C#,Xml,Serialization,我正在尝试将一个对象(比如用户有多个字段)转换为XML。问题是,当它尝试序列化ILIST成员时,会出现异常。 以下是我正在使用的代码: var stringwriter = new System.IO.StringWriter(); var serializer = new XmlSerializer(User.GetType()); <!-- Getting exception here --> serializer.Serialize(stringwriter, User);

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

var stringwriter = new System.IO.StringWriter(); 
var serializer = new XmlSerializer(User.GetType()); <!-- Getting exception here -->
serializer.Serialize(stringwriter, User); 
return stringwriter.ToString();
var stringwriter=new System.IO.stringwriter();
var serializer=新的XmlSerializer(User.GetType());
serializer.Serialize(stringwriter,用户);
返回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; }
}
类用户
{公共虚拟字符串名称{get;set;}
公共虚拟日期时间?上次更新的{get;set;}
公共虚拟int?联系人ID{get;set;}
公共虚拟IList扇区{get;set;}
公共虚拟访问级别访问级别{get;set;}
公共虚拟IList用户角色{get;set;}
}

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

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

但是,您可以使用较新的

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

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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Runtime.Serialization;
使用系统文本;
使用System.Xml;
名称空间演示
{
[DataContract(名称空间=”)]
公共类用户
{
[数据成员]
公共虚拟字符串名
{
得到;
设置
}
[数据成员]
公共虚拟日期时间?上次更新
{
得到;
设置
}
[数据成员]
公共虚拟int?联系人ID
{
得到;
设置
}
[数据成员]
公共虚拟工业部门
{
得到;
设置
}
}
内部课程计划
{
私家车
{
用户=新用户();
user.sections=new[]{“一”、“二”、“三”};
user.Name=“测试名称”;
//连载
var result=新的StringBuilder();
DataContractSerializer serializer=新的DataContractSerializer(user.GetType());
使用(var stringWriter=新的stringWriter(结果))
使用(var xmlWriter=xmlWriter.Create(stringWriter,新的XmlWriterSettings{Indent=true}))
{
serializer.WriteObject(xmlWriter,用户);
}
字符串serialisedToString=result.ToString();
Console.WriteLine(串行数据存储);
//反序列化
使用(var stringReader=newstringreader(serialisedToString))
使用(var xmlReader=xmlReader.Create(stringReader))
{
user=(user)serializer.ReadObject(xmlReader);
}
Console.WriteLine(用户名);
}
私有静态void Main()
{
新程序().run();
}
}
}

尝试将
用户
类标记为
可序列化
,为此添加什么异常消息?
用户
在您的代码中,它与类和对象或仅类?无法序列化成员“User.Sectors”类型的“System.Collections.ilis”,而序列化用户是实例而不是类。是否有办法检查成员是否为我正在序列化其对象的类是否可序列化,然后调整该特定成员的逻辑。我对用户类的控制较少。:(因此,任何可以扩展代码以处理IList成员的方法都将是首选。