【问题标题】:Translate Service Call Object Back to the Original Object将服务调用对象翻译回原始对象
【发布时间】:2010-01-18 12:57:18
【问题描述】:

我有一个通过 Web 服务公开的对象,该对象被另一个系统使用。该系统还使用相同的 WSDL 按需将对象返回给我们。我想知道是否可以将同一个对象传递回原始对象?

我尝试执行以下操作,但实际上并不会在填充对象的情况下将其转换回...任何帮助都会很棒!

谢谢!

注意下面列出的方法代码基于http://www.dotnetjohn.com/articles.aspx?articleid=173

    public void ConvertBack()
    {
        ThirdParty.Animal animal;
        using (var svc = new ThirdPartySoapClient())
            thirdPartyAnimal = svc.GetAnimal("Identifier");

        var xml = SerializeObject(thirdPartyAnimal, typeof(ThirdParty.Animal));

        var originalAnimal = (OriginalNamespace.Animal)DeserializeObject(xml, typeof(OrginalNamespace.Animal));

        Assert.AreEqual(originalAnimal.Name, animal.Name);
    }


    /// <summary>
    /// Method to convert a custom Object to XML string
    /// </summary>
    /// <param name="pObject">Object that is to be serialized to XML</param>
    /// <param name="typeOfObject">typeof() object that is being passed to be serialized to XML</param>
    /// <returns>XML string</returns>
    public string SerializeObject(object pObject, Type typeOfObject)
    {
        try
        {
            var memoryStream = new MemoryStream();
            var xs = new XmlSerializer(typeOfObject);
            var xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);

            xs.Serialize(xmlTextWriter, pObject);
            memoryStream = (MemoryStream) xmlTextWriter.BaseStream;
            var xmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
            return xmlizedString;
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            return null;
        }
    }

    /// <summary>
    /// Method to reconstruct an Object from XML string
    /// </summary>
    /// <param name="pXmlizedString">XML To Be Converted to an Object</param>
    /// <param name="typeOfObject">typeof() object that is being passed to be serialized to XML</param>
    /// <returns></returns>
    public object DeserializeObject(string pXmlizedString, Type typeOfObject)
    {
        var xs = new XmlSerializer(typeOfObject);
        var memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
        new XmlTextWriter(memoryStream, Encoding.UTF8);
        return xs.Deserialize(memoryStream);
    }

    /// <summary>
    /// To convert a Byte Array of Unicode values (UTF-8 encoded) to a complete String.
    /// </summary>
    /// <param name="characters">Unicode Byte Array to be converted to String</param>
    /// <returns>String converted from Unicode Byte Array</returns>
    private static string UTF8ByteArrayToString(Byte[] characters)
    {
        var encoding = new UTF8Encoding();
        var constructedString = encoding.GetString(characters);
        return (constructedString);
    }

    /// <summary>
    /// Converts the String to UTF8 Byte array and is used in De serialization
    /// </summary>
    /// <param name="pXmlString"></param>
    /// <returns></returns>
    private static Byte[] StringToUTF8ByteArray(string pXmlString)
    {
        var encoding = new UTF8Encoding();
        var byteArray = encoding.GetBytes(pXmlString);
        return byteArray;
    }

【问题讨论】:

    标签: c# .net web-services serialization


    【解决方案1】:

    从 WSDL 生成代理时,有一个名为 "/sharetypes" 的选项应该可以解决此问题

    您可以从命令行工具或“添加 Web 服务”对话框的选项区域中使用它

    【讨论】:

    • 谢谢,但我实际上正在寻找的是采用 WSDL 类型并将其恢复为原始类型。因此,假设我有 EntityObject.Name.cs、Services.WebService1.asmx - 这有一个名为 GetName 的方法,它返回一个 NameObject 但当然是 WSDL 表单,BusinessLayer - 有一个接受 EnityObject.Name 的方法在第四个项目中你有对 Service、Business 和 Entity 的引用,您要调用该服务以获取 Name 对象并将其传递给业务,这将如何实现。很抱歉我最初的问题有任何歧义,感谢您的帮助!
    猜你喜欢
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2017-09-11
    • 2012-12-20
    • 2023-03-30
    相关资源
    最近更新 更多