DataContract序列化抽象类

6

我有一个接口IServiceInfo和一个抽象类ServiceInfo。有几个从ServiceInfo继承的类,例如CoreServiceInfo、ModuleServiceInfo等。存在一个服务契约RootService,它返回IServiceInfo。

 public IServiceInfo GetServiceInfo()
 {
     return (IServiceInfo)new CoreServiceInfo();
 }

我遇到了序列化的问题。我可以使用ServiceKnownType来识别基类,以及KnownType来识别子类。
问题是,我不知道所有的ServiceInfo子类,因为应用程序可能具有从ServiceInfo继承的不同子类插件,所以我无法告诉序列化器在序列化XML中包含所有的子类。
我可以忽略抽象类,但它包含某些常见实现,所以我需要保留它。作为一种解决方法,我可以有另一个类,比如“sampleServiceInfo”,并将所有信息类转换为sampleServiceInfo,并从Service方法返回它,并定义KnownType到ServiceInfo类。
[KnownType(typeof(sampleServiceInfo))]
public class ServiceInfo : IServiceInfo

但这不是一个很好的方法。请给予建议。我需要编写自定义序列化程序吗?是否有办法只序列化基类并忽略子类,当两者具有相同成员时?

如果您自己都不知道派生类,那么您如何期望.NET知道它呢? - John Saunders
这是边界,应用程序包含可插拔服务。 - hungryMind
1个回答

7
获取所有加载的程序集中实现指定抽象类或接口的类型(参考:通过反射实现接口
 var allTypes =  AppDomain
            .CurrentDomain
            .GetAssemblies()
            .SelectMany(assembly => assembly.GetTypes())
            .Where(type => typeof(A).IsAssignableFrom(type));

然后创建一个序列化器,并将所有类型作为已知类型参数传递,如下所示:

var serializer = new DataContractSerializer(typeof(A), allTypes);

就是这样 - 你将能够序列化和反序列化任何从A派生出来的类型(A可以是类或接口,如果是接口,序列化程序将把元素写成派生自xs:anyType的形式)。


谢谢你的回复,所以最终我需要编写自定义序列化器。我原本期望有一些类级别的属性可以忽略序列化,或者一些好的模式之类的东西。不管怎样,非常感谢。 - hungryMind
@hungryMind 如果这个回答解决了你的问题,你可以通过勾选投票旁边的标记来标记它。 - jcolebrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接