c#普通接口类型如何xml序列化 在线等

csdn_wangkp 2009-02-04 01:43:56

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类型不能被序列化

请高手指点 ,在线等
...全文
1505 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
谢谢jinjazz ,谢谢各位了。

马上结贴。

lovefootball 2009-02-04
  • 打赏
  • 举报
回复
XmlSerializer是不支持interface的

如果接口成员是无关紧要的话
你可以用XmlIgnore忽略掉

或者你就改成抽象类
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
to jinjazz

我也查阅了大量的论坛帖子,好像也没找到什么好办法。
看来只能废掉接口了。道理来讲,抽象类也只是相当于一个协议。
object那就更啥也说不上了。为啥呢
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
你看看ms的几个常用序列化对象比如dataset,datatable之类的都是自己控制序列化方法的,都实现过IXmlSerializable
接口。
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
8楼的兄弟太幽默了。。。。
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
我这个人比较懒,再说也有点高估ms了。
不明白为什么接口不可以,而抽象类却可以。

由于类里面的几个项目的类型是不确定,我最开始是用object类型来实现的,
序列化也没什么问题。不过由于还是感觉不太正规,毕竟是正式的项目,
所以准备用接口,哪知道ms竟然不支持,查了msdn,他也没有说不支持接口呀
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
你要知道,接口只是一个协议,它本身是没有实现方式的,所以其实例也谈不上序列化出来,关键还是class本身的元素。
宝_爸 2009-02-04
  • 打赏
  • 举报
回复
public class Parameter22
{
public Parameter22()
{

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

}
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
类型越复杂当然序列化难度越大了,你不能指望ms把所有事情都做掉吧。
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
to jinjazz

谢谢你的代码,不过还有疑问

如果接口类或者其他的子项目类型极其复杂的话,比如说还有其他的集合对象,自定义类之类的话,
自己实现的话,一个一个自定义输出,那会死人吧
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
输出

<?xml version="1.0" encoding="utf-8"?>
<Parameter22>
<k0>0</k0>
<k1 />
<k2 />
</Parameter22>
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
自己控制序列化的方法

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();

}
}
}
csdn_wangkp 2009-02-04
  • 打赏
  • 举报
回复
to xu2007

你说的是这样的吧
[Serializable]
public class C1 : ITest
{
public C1()
{

}
}

早就试过了,不好用的
jinjazz 2009-02-04
  • 打赏
  • 举报
回复
XmlSerializer不支持接口申明,你可以把接口换为抽象类。或者自己控制class的序列化方法
xu_2007 2009-02-04
  • 打赏
  • 举报
回复
在public class C1 : ITest
{
public C1()
{}
}类上面加上[Serializer]
最终结果为:

[Serializer]//指示编译器此类可以被序列化
public class C1 : ITest
{
public C1()
{}
}

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧