【问题标题】:WCF System.Object SerializationWCF System.Object 序列化
【发布时间】:2012-05-28 13:32:32
【问题描述】:

我有一个要求,我必须使用 System.Object 作为 WCF 中的参数。由于它不可序列化,因此我收到消息,因为它使用 System.Object,因此不支持该操作。这个问题的任何解决方案。

【问题讨论】:

  • 是什么原因让您想通过面向合约的协议发送object(完全无合约)?另外(我什至讨厌自己提到它)-您是否尝试过通过配置启用 NetDataContractSerializer?
  • 如果一个对象不会序列化任何东西,你期望在另一边得到什么?

标签: c# .net wcf wcf-client


【解决方案1】:

当通过网络发送消息时,默认情况下 WCF 只会序列化足以传递消息的内容,即合约的成员。如果您的消息将“对象”作为参数,则需要通过网络发送带有类型信息的额外信息。如果您在客户端和服务器上使用相同的程序集,则可以在服务器(和客户端)中使用 NetDataContractSerializer(而不是默认的 DataContractSerializer),它们将能够交换任意对象,如下面的代码所示。但是,正如@MarcGravell 提到的,这可能不是 WCF 的最佳用法......

启用NetDataContractSerializer的代码:

public class Post_8b2c7ad7_b1c3_410b_b907_f25cee637110
{
    public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public override string ToString()
        {
            return string.Format("Person[Name={0},Age={1}]", Name, Age);
        }
    }
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        object Echo(object obj);
    }
    public class Service : ITest
    {
        public object Echo(object obj)
        {
            return obj;
        }
    }
    public class ReplaceSerializerOperationBehavior : DataContractSerializerOperationBehavior
    {
        public ReplaceSerializerOperationBehavior(OperationDescription operation)
            : base(operation)
        {
        }
        public override XmlObjectSerializer CreateSerializer(Type type, string name, string ns, IList<Type> knownTypes)
        {
            return new NetDataContractSerializer(name, ns);
        }
        public override XmlObjectSerializer CreateSerializer(Type type, XmlDictionaryString name, XmlDictionaryString ns, IList<Type> knownTypes)
        {
            return new NetDataContractSerializer(name, ns);
        }
        public static void ReplaceSerializer(ServiceEndpoint endpoint)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                for (int i = 0; i < operation.Behaviors.Count; i++)
                {
                    if (operation.Behaviors[i] is DataContractSerializerOperationBehavior)
                    {
                        operation.Behaviors[i] = new ReplaceSerializerOperationBehavior(operation);
                        break;
                    }
                }
            }
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
        var endpoint = host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), "");
        ReplaceSerializerOperationBehavior.ReplaceSerializer(endpoint);
        host.Open();
        Console.WriteLine("Host opened");

        ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new BasicHttpBinding(), new EndpointAddress(baseAddress));
        ReplaceSerializerOperationBehavior.ReplaceSerializer(factory.Endpoint);
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.Echo("Hello"));
        Console.WriteLine(proxy.Echo(123.456));
        Console.WriteLine(proxy.Echo(new Uri("http://tempuri.org")));
        Console.WriteLine(proxy.Echo(new Person { Name = "John Doe", Age = 33 }));

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多