使用抽象类进行WCF序列化

使用抽象类进行WCF序列化,wcf,inheritance,serialization,abstract-class,Wcf,Inheritance,Serialization,Abstract Class,我的合同定义如下: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class CommandWebService : ICommandWebService { public Exec

我的合同定义如下:

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
 public class CommandWebService : ICommandWebService
 {
     public ExecuteResponse Execute(CommandBase command)
     {
     ...
     }
 }
命令库为抽象类时:

[Serializable]
[KnownType("GetKnownTypes")]
public abstract class CommandBase : Message, ICommand
{
     public static Type[] GetKnownTypes()
     {
         var types = from asm in AppDomain.CurrentDomain.GetAssemblies()
                     from type in asm.GetTypes()
                     where typeof(CommandBase).IsAssignableFrom(type) && !type.IsAbstract
                     select type;

         return types.ToArray();
     }
}
我在另一个项目中使用这些工具来实例化我的WCF服务:

var bus = RabbitHutch.CreateBus("host=localhost"); ;
var commandHandler = new CommandHandlerService();
var projectionHandler = new ProjectionHandlerService();
var commandWebService = new CommandWebService(bus, commandHandler, projectionHandler);

using (var commandServiceHost = new ServiceHost(commandWebService))
{
     commandServiceHost.Open();
     Console.WriteLine("service started");
     var quitFlag = false;
     while (!quitFlag)
     {
         var keyInfo = Console.ReadKey();
         quitFlag = keyInfo.Key == ConsoleKey.C
                    && keyInfo.Modifiers == ConsoleModifiers.Control;
      }
}
使用以下服务模型:

 <system.serviceModel>
        <bindings/>
        <services>
            <service name="CommandService.CommandWebService" >
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:1338/MyApp"/>
                    </baseAddresses>
                </host>
                <endpoint address=""
                          binding="basicHttpBinding"
                          contract="CommandService.ICommandWebService"/>
                <endpoint address="mex"
                    binding="mexHttpBinding"
                    contract="IMetadataExchange" />
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior>
                    <serviceMetadata httpGetEnabled="True"/>
                    <serviceDebug includeExceptionDetailInFaults="true" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
对我的web服务的调用详细信息如下:

var id = Guid.NewGuid();
var cmdCreate = Build.Cmd1
                     .ForCreationDate(DateTime.Now)
                     .ForDescription("test")
                     .Build(id);

var client = new Ref1.CommandWebServiceClient();

client.Execute(cmdCreate);
生成的消息具有正确的id,因为此信息是抽象类CommandBase的一部分,但creationdate和description不是xml的一部分

有什么我遗漏的吗

[编辑] 有一件重要的事我没说。我不希望命令类中有任何属性。 [/编辑]


感谢您的阅读,

如评论中所述,我的命令Cmd1具有用于说明和创建日期的专用设置器。与使用WCF一样,我使用的是xmlserializer,有两件事需要知道:

一定有个裸体医生 属性必须具有公共setter才能序列化


如果可以的话,我现在要把xml序列化程序改成不同的东西,以绕过这两个障碍。

Ok找到了解决方案。。对不起打扰了你的睡眠。我的命令Cmd1具有描述和创建日期的专用设置器。。。我将删除此问题…您应该自己回答,并将答案标记为解决方案,以帮助其他用户解决类似问题
 [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]     
 [System.ServiceModel.ServiceContractAttribute(ConfigurationName="Contabilita.ICommandWebService")]
 public interface ICommandWebService 
 {
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/ICommandWebService/Execute", ReplyAction="http://tempuri.org/ICommandWebService/ExecuteResponse")]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd1))]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd2))]
        [System.ServiceModel.ServiceKnownTypeAttribute(typeof(MyNamespace.Cmd3))]
        MyConsole.Ref1.ExecuteResponse Execute(Common.CommandBase command);
    }
var id = Guid.NewGuid();
var cmdCreate = Build.Cmd1
                     .ForCreationDate(DateTime.Now)
                     .ForDescription("test")
                     .Build(id);

var client = new Ref1.CommandWebServiceClient();

client.Execute(cmdCreate);