Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不是';无法将像IList这样的接口序列化为Xml文件<;T>;?_C#_Xml_Serialization_Interface_Xml Serialization - Fatal编程技术网

C# 为什么不是';无法将像IList这样的接口序列化为Xml文件<;T>;?

C# 为什么不是';无法将像IList这样的接口序列化为Xml文件<;T>;?,c#,xml,serialization,interface,xml-serialization,C#,Xml,Serialization,Interface,Xml Serialization,我试图将一个声明为ILIst的对象序列化为Xml文件,但它是List的一个实例。异常告诉我原因:无法序列化接口 这在我的设计中是非常必要的,或者我必须以其他方式序列化它?您必须知道要实例化的具体类型 序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。您必须知道要实例化的具体类型 序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。我可以看到两个选项

我试图将一个声明为ILIst的对象序列化为Xml文件,但它是List的一个实例。异常告诉我原因:无法序列化接口


这在我的设计中是非常必要的,或者我必须以其他方式序列化它?

您必须知道要实例化的具体类型


序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。

您必须知道要实例化的具体类型

序列化程序必须根据元数据,而不是运行时类型。如果您只知道目标对象必须实现IList,那么您会构造什么?甚至不一定有实现它的类。

我可以看到两个选项:

  • 在将其传递给序列化程序之前,可以将其强制转换回列表。不理想,但它会起作用
  • 迭代IList并将每个项独立地序列化到同一个流
  • 我可以看到两种选择:

  • 在将其传递给序列化程序之前,可以将其强制转换回列表。不理想,但它会起作用
  • 迭代IList并将每个项独立地序列化到同一个流

  • 无法序列化接口,因为它不包含任何数据。您所能做的最好的事情可能是实现ISerializable以自己控制序列化。

    您无法序列化接口,因为它不包含任何数据。您所能做的最好的事情可能是实现ISerializable以自己控制序列化。

    这应该不是问题,您可以始终使用object.GetType()。下面是一个例子:

    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;
    
    class Program {
        static void Main(string[] args) {
            System.Collections.IList list = new List<int> { 1, 2, 3 };
            var ser = new XmlSerializer(list.GetType());
            ser.Serialize(Console.Out, list);
            Console.ReadLine();
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Xml.Serialization;
    班级计划{
    静态void Main(字符串[]参数){
    System.Collections.IList list=新列表{1,2,3};
    var ser=新的XmlSerializer(list.GetType());
    序列序列化(Console.Out,list);
    Console.ReadLine();
    }
    }
    
    这应该不是问题,您可以始终使用object.GetType()。下面是一个例子:

    using System;
    using System.Collections.Generic;
    using System.Xml.Serialization;
    
    class Program {
        static void Main(string[] args) {
            System.Collections.IList list = new List<int> { 1, 2, 3 };
            var ser = new XmlSerializer(list.GetType());
            ser.Serialize(Console.Out, list);
            Console.ReadLine();
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.Xml.Serialization;
    班级计划{
    静态void Main(字符串[]参数){
    System.Collections.IList list=新列表{1,2,3};
    var ser=新的XmlSerializer(list.GetType());
    序列序列化(Console.Out,list);
    Console.ReadLine();
    }
    }
    
    我想您需要使用IList保持设计的原因是因为它是其他模块的通用接口。一种可能的解决办法:

    而不是:

        [XmlElement("Test")]
        public IList<String> Tests
        {
            get;
            set;
        }
    
    [XmlElement(“测试”)]
    公共IList测试
    {
    得到;
    设置
    }
    
    您可能可以尝试:

        [XmlElement("Test")]
        public List<String> TestList
        {
            get;
            set;
        }
    
        [XmlIgnore]
        public IList<String> Tests
        {
            get { return TestList; }
        }
    
    [XmlElement(“测试”)]
    公共列表测试列表
    {
    得到;
    设置
    }
    [XmlIgnore]
    公共IList测试
    {
    获取{return TestList;}
    }
    

    通过这种方式,您可以保留相同的接口,同时利用.Net Xml库中的序列化/反序列化功能。

    我想您需要使用IList保留设计的原因是因为它是其他模块的通用接口。一种可能的解决办法:

    而不是:

        [XmlElement("Test")]
        public IList<String> Tests
        {
            get;
            set;
        }
    
    [XmlElement(“测试”)]
    公共IList测试
    {
    得到;
    设置
    }
    
    您可能可以尝试:

        [XmlElement("Test")]
        public List<String> TestList
        {
            get;
            set;
        }
    
        [XmlIgnore]
        public IList<String> Tests
        {
            get { return TestList; }
        }
    
    [XmlElement(“测试”)]
    公共列表测试列表
    {
    得到;
    设置
    }
    [XmlIgnore]
    公共IList测试
    {
    获取{return TestList;}
    }
    

    通过这种方式,您可以保持相同的接口,同时利用.Net Xml库中的序列化/反序列化功能。

    周围有许多重复项,请使用Search试用可能重复的可能重复项周围有许多重复项,使用Search试用可能重复的可能重复项,我有一个对象(我计划序列化),它有一个属性,它是一个列表,你认为我可以在XmlArray中指定类型吗?我有一个对象(我计划序列化),它有一个属性,它是一个列表,你认为我可以在XmlArray中指定类型吗?