【问题标题】:serialize runtime objects into svcutil generated partial class representations将运行时对象序列化为 svcutil 生成的部分类表示
【发布时间】:2012-01-08 13:58:17
【问题描述】:

我使用 svcutil 生成以下代码:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:4.0.30319.239
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace System.Net
{
    using System.Runtime.Serialization;


    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="EndPoint", Namespace="http://schemas.datacontract.org/2004/07/System.Net")]
    [System.Runtime.Serialization.KnownTypeAttribute(typeof(System.Net.IPEndPoint))]
    public partial class EndPoint : object, System.Runtime.Serialization.IExtensibleDataObject
    {

        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="IPEndPoint", Namespace="http://schemas.datacontract.org/2004/07/System.Net")]
    public partial class IPEndPoint : System.Net.EndPoint
    {

        private System.Net.IPAddress m_AddressField;

        private int m_PortField;

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public System.Net.IPAddress m_Address
        {
            get
            {
                return this.m_AddressField;
            }
            set
            {
                this.m_AddressField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public int m_Port
        {
            get
            {
                return this.m_PortField;
            }
            set
            {
                this.m_PortField = value;
            }
        }
    }

    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="IPAddress", Namespace="http://schemas.datacontract.org/2004/07/System.Net")]
    public partial class IPAddress : object, System.Runtime.Serialization.IExtensibleDataObject
    {

        private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

        private long m_AddressField;

        private System.Net.Sockets.AddressFamily m_FamilyField;

        private int m_HashCodeField;

        private ushort[] m_NumbersField;

        private long m_ScopeIdField;

        public System.Runtime.Serialization.ExtensionDataObject ExtensionData
        {
            get
            {
                return this.extensionDataField;
            }
            set
            {
                this.extensionDataField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public long m_Address
        {
            get
            {
                return this.m_AddressField;
            }
            set
            {
                this.m_AddressField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public System.Net.Sockets.AddressFamily m_Family
        {
            get
            {
                return this.m_FamilyField;
            }
            set
            {
                this.m_FamilyField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public int m_HashCode
        {
            get
            {
                return this.m_HashCodeField;
            }
            set
            {
                this.m_HashCodeField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public ushort[] m_Numbers
        {
            get
            {
                return this.m_NumbersField;
            }
            set
            {
                this.m_NumbersField = value;
            }
        }

        [System.Runtime.Serialization.DataMemberAttribute(IsRequired=true)]
        public long m_ScopeId
        {
            get
            {
                return this.m_ScopeIdField;
            }
            set
            {
                this.m_ScopeIdField = value;
            }
        }
    }
}
namespace System.Net.Sockets
{
    using System.Runtime.Serialization;


    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "4.0.0.0")]
    [System.Runtime.Serialization.DataContractAttribute(Name="AddressFamily", Namespace="http://schemas.datacontract.org/2004/07/System.Net.Sockets")]
    public enum AddressFamily : int
    {

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unknown = -1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unspecified = 0,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Unix = 1,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        InterNetwork = 2,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        ImpLink = 3,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Pup = 4,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Chaos = 5,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        NS = 6,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ipx = 6,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Iso = 7,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Osi = 7,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ecma = 8,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        DataKit = 9,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ccitt = 10,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Sna = 11,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        DecNet = 12,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        DataLink = 13,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Lat = 14,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        HyperChannel = 15,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        AppleTalk = 16,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        NetBios = 17,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        VoiceView = 18,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        FireFox = 19,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Banyan = 21,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Atm = 22,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        InterNetworkV6 = 23,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Cluster = 24,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Ieee12844 = 25,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Irda = 26,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        NetworkDesigners = 28,

        [System.Runtime.Serialization.EnumMemberAttribute()]
        Max = 29,
    }
}


[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="IConnectionHost", CallbackContract=typeof(IConnectionHostCallback), SessionMode=System.ServiceModel.SessionMode.Required)]
public interface IConnectionHost
{

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IConnectionHost/OpenTunnel", ReplyAction="http://tempuri.org/IConnectionHost/OpenTunnelResponse")]
    bool OpenTunnel(int serverPort);

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IConnectionHost/CloseTunnel", ReplyAction="http://tempuri.org/IConnectionHost/CloseTunnelResponse")]
    bool CloseTunnel(int serverPort);

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IConnectionHost/DisconnectAtHost", ReplyAction="http://tempuri.org/IConnectionHost/DisconnectAtHostResponse")]
    bool DisconnectAtHost(int serverPort, System.Net.IPEndPoint client);

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IConnectionHost/Reply", ReplyAction="http://tempuri.org/IConnectionHost/ReplyResponse")]
    int Reply(int serverPort, System.Net.IPEndPoint client, [System.ServiceModel.MessageParameterAttribute(Name="reply")] byte[] reply1);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IConnectionHostCallback
{

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/IConnectionHost/Relay")]
    void Relay(int serverPort, System.Net.IPEndPoint client, byte[] message);

    [System.ServiceModel.OperationContractAttribute(IsOneWay=true, Action="http://tempuri.org/IConnectionHost/DisconnectAtClient")]
    void DisconnectAtClient(int serverPort, System.Net.IPEndPoint client);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public interface IConnectionHostChannel : IConnectionHost, System.ServiceModel.IClientChannel
{
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class ConnectionHostClient : System.ServiceModel.DuplexClientBase<IConnectionHost>, IConnectionHost
{

    public ConnectionHostClient(System.ServiceModel.InstanceContext callbackInstance) : 
            base(callbackInstance)
    {
    }

    public ConnectionHostClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName) : 
            base(callbackInstance, endpointConfigurationName)
    {
    }

    public ConnectionHostClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress) : 
            base(callbackInstance, endpointConfigurationName, remoteAddress)
    {
    }

    public ConnectionHostClient(System.ServiceModel.InstanceContext callbackInstance, string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(callbackInstance, endpointConfigurationName, remoteAddress)
    {
    }

    public ConnectionHostClient(System.ServiceModel.InstanceContext callbackInstance, System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(callbackInstance, binding, remoteAddress)
    {
    }

    public bool OpenTunnel(int serverPort)
    {
        return base.Channel.OpenTunnel(serverPort);
    }

    public bool CloseTunnel(int serverPort)
    {
        return base.Channel.CloseTunnel(serverPort);
    }

    public bool DisconnectAtHost(int serverPort, System.Net.IPEndPoint client)
    {
        return base.Channel.DisconnectAtHost(serverPort, client);
    }

    public int Reply(int serverPort, System.Net.IPEndPoint client, byte[] reply1)
    {
        return base.Channel.Reply(serverPort, client, reply1);
    }
}

然后在 Mathematica (8) & .NET/Link 中创建一个 IPEndPoint 对象:

ep // ClearAll
ep[port_] := NETNew["System.Net.IPEndPoint", NETNew["System.Net.IPAddress", {127, 0, 0, 1}], port_]

retargetedEndPoint=ep@900

并尝试调用:

.Reply(.,retargetedEndPoint,.)

问题是 Mathematica IPEndPoint 对象是真正的 System.NET.IPEndPoint 类型,而预期的是一些序列化表示!

  1. 如何转换后者?
  2. svcutil 生成的这些部分类的行为如何,它们是否扩展?真实 System.NET.IPEndPoint 类型的定义,还是仅仅隐藏它们,因为假设 C# 编译器(而不是运行时)将自动处理必要的转换?

【问题讨论】:

    标签: .net wcf serialization wolfram-mathematica svcutil.exe


    【解决方案1】:

    在 System.Net 命名空间中生成任何东西看起来都不对。我想也许您想使用 svcutil 的 /reference:&lt;file path&gt; 选项,以便它知道在哪里查找现有类型。

    【讨论】:

    • 这就是诀窍!我正在开发一个 Mathematica 包,它生成实现 WCF 双工服务回调接口的事件调度程序类型:回调方法通过事件传播到 Mathematica。我已经自动化了一切,但在这一步有点停滞不前,做所有必要的接线以使其工作非常无聊。现在,我将默认引用大量 .NET 程序集,并在需要时为我的用户提供覆盖此行为的选项。
    • 哇刚刚重新测试了重定向!使用正确引用的类型,一切都像魅力一样工作:portfusion.sourceforge.net/i/mathematica-wcfservices-duplex.png
    • 太棒了。我总是喜欢在灯光下看到我的名字! :)
    猜你喜欢
    • 2011-01-28
    • 1970-01-01
    • 2017-08-15
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多