public interface ITest
    {
      
    }    public class C1 : ITest
    {
        public C1()
        {}
    }
 
    public class Parameter22
    {
        public Parameter22()
        {        }
        public int k0 = 0;
        public C1 k1 = new C1();
        public ITest k2 = new C1();    }序列化测试代码
            Parameter22 ob = new Parameter22();
            Type ty = typeof(Parameter22);
            XmlSerializer serializer = new XmlSerializer(ty);
             string filename = "d:\\test.xml";
            TextWriter tw = new StreamWriter(filename);
            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
            xmlns.Add(string.Empty, string.Empty);
            serializer.Serialize(tw, ob, xmlns);
            tw.Close();错误信息是k2类型不能被序列化请高手指点 ,在线等

解决方案 »

  1.   

    在public class C1 : ITest 
        { 
            public C1() 
            {} 
        }类上面加上[Serializer] 
    最终结果为:[Serializer]//指示编译器此类可以被序列化
    public class C1 : ITest 
        { 
            public C1() 
            {} 
        }
      

  2.   

    XmlSerializer不支持接口申明,你可以把接口换为抽象类。或者自己控制class的序列化方法
      

  3.   

    to xu2007你说的是这样的吧
        [Serializable]
        public class C1 : ITest
        {
            public C1()
            {        }
        }早就试过了,不好用的
      

  4.   

    自己控制序列化的方法using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml.Serialization;
    using System.IO;
    using System.Xml;
    namespace ConsoleApplication1
    {
        public  interface ITest
        {    }
        public class  C1 : ITest
        {
            public C1()
            { }
            public override string ToString()
            {
                return "";
            }
        }    public class Parameter22:IXmlSerializable
        {
            public Parameter22()
            {        }
            public int k0 = 0;
            public C1 k1 = new C1();
            public ITest k2 = new C1();        public System.Xml.Schema.XmlSchema GetSchema()
            {
                return null;
            }
            public void ReadXml(XmlReader reader)
            { }
            public void WriteXml(XmlWriter writer)
            {
                writer.WriteElementString("k0", k0.ToString());
                writer.WriteElementString("k1", k1.ToString());
                writer.WriteElementString("k2", k2.ToString());
            }
        } 
        class Program
        {
            static void Main(string[] args)
            {
                Parameter22 ob = new Parameter22();
                Type ty = typeof(Parameter22);
                XmlSerializer serializer = new XmlSerializer(ty);
                string filename = "d:\\test.xml";
                TextWriter tw = new StreamWriter(filename);
                XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces();
                xmlns.Add(string.Empty, string.Empty);
                serializer.Serialize(tw, ob, xmlns);
                tw.Close(); 
                
            }
        }
    }
      

  5.   

    输出<?xml version="1.0" encoding="utf-8"?>
    <Parameter22>
      <k0>0</k0>
      <k1 />
      <k2 />
    </Parameter22>
      

  6.   

    to jinjazz 谢谢你的代码,不过还有疑问如果接口类或者其他的子项目类型极其复杂的话,比如说还有其他的集合对象,自定义类之类的话,
    自己实现的话,一个一个自定义输出,那会死人吧
      

  7.   

    public class Parameter22 
        { 
            public Parameter22() 
            {         } 
            public int k0 = 0; 
            public C1 k1 = new C1(); 
            public C1 k2 = new C1();     } 
      

  8.   

    你要知道,接口只是一个协议,它本身是没有实现方式的,所以其实例也谈不上序列化出来,关键还是class本身的元素。
      

  9.   

    我这个人比较懒,再说也有点高估ms了。
    不明白为什么接口不可以,而抽象类却可以。由于类里面的几个项目的类型是不确定,我最开始是用object类型来实现的,
    序列化也没什么问题。不过由于还是感觉不太正规,毕竟是正式的项目,
    所以准备用接口,哪知道ms竟然不支持,查了msdn,他也没有说不支持接口呀
      

  10.   

    你看看ms的几个常用序列化对象比如dataset,datatable之类的都是自己控制序列化方法的,都实现过IXmlSerializable
    接口。
      

  11.   

    to jinjazz 我也查阅了大量的论坛帖子,好像也没找到什么好办法。
    看来只能废掉接口了。道理来讲,抽象类也只是相当于一个协议。
    object那就更啥也说不上了。为啥呢
      

  12.   

    XmlSerializer是不支持interface的如果接口成员是无关紧要的话
    你可以用XmlIgnore忽略掉或者你就改成抽象类
      

  13.   

    谢谢jinjazz ,谢谢各位了。马上结贴。