【问题标题】:How to serialize an "Object" type in PHP to be sent to a WCF Service?如何序列化 PHP 中的“对象”类型以发送到 WCF 服务?
【发布时间】:2012-12-20 06:36:01
【问题描述】:

我的 WCF 服务可以接受动态更新字段的请求,方法是传递包装在 Object 和 DynamicAttributeType 枚举中的值来指定类型,如下所示:

[DataContract]
[KnownType(typeof(string))]
[KnownType(typeof(bool))]
[KnownType(typeof(PickListInfo))]
public class DynamicAttributeInfo
{
  [DataMember]
  public string Name { get; set; }

  [DataMember]
  public object Value { get; set; }

  [DataMember]
  public DynamicAttributeType DynamicAttributeType { get; set; }
}

这适用于 .Net 客户端。我正在尝试帮助 PHP 客户端使其工作。到目前为止,我们在创建将作为 Object 传递但仍包含内部真实值 (string/bool/PickList) 的东西时遇到了麻烦。

请注意:WCF 服务正在生产中,不能更改它。我正在寻找 PHP 客户端的解决方案。

以下是他的不同尝试:

1) 第一次尝试 - 简单的字符串作为值:

<?php
   $da = new DynamicAttributeInfo();
   $da->DynamicAttributeType = 'String';
   $da->Name = 'lv_eutmsource';
   $da->Value = 'test';
?>

例外: [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities”的结束元素“值”。找到文本“测试”。第 2 行,位置 725。

2) 二次拍摄(半成功):空类的新对象

<?php
 class testText() {
 }

 $da = new DynamicAttributeInfo();
 $da->DynamicAttributeType = 'String';
 $da->Name = 'lv_eutmsource';
 $da->Value = new testText();
?>

这次没有 WCF 异常,但实际上没有传递任何值,我的代码以“Object.ToString”结束。

3) 其他尝试:非空类 - 他尝试添加不同名称的字段 - 没有任何效果。

<?php
 class Value() {
     public $String;
 }

 $text = new Value();
 $text->String = 'test text';

 $da = new DynamicAttributeInfo();
 $da->DynamicAttributeType = 'String';
 $da->Name = 'lv_eutmsource';
 $da->Value = $text;
?>

例外: [InnerException] => 标准类对象 ( [帮助链接] => [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities”的结束元素“值”。从命名空间“”中找到元素“字符串”。

<?php
 class textText() {
     public $text;
 }

 $text = new testText();
 $text->text = 'test text';

 $da = new DynamicAttributeInfo();
 $da->DynamicAttributeType = 'String';
 $da->Name = 'lv_eutmsource';
 $da->Value = $text;
?>

例外: [InnerException] => 标准类对象 ( [帮助链接] => [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities”的结束元素“值”。从命名空间“”中找到元素“文本”。

<?php
 class Value() {
     public $Value;
 }

 $text = new Value();
 $text->Value = 'test text';

 $da = new DynamicAttributeInfo();
 $da->DynamicAttributeType = 'String';
 $da->Name = 'lv_eutmsource';
 $da->Value = $text;
?>

例外: [InnerException] => 标准类对象 ( [帮助链接] => [InnerException] => 标准类对象 ( [帮助链接] => [内部异常] => [消息] => 预期来自命名空间“http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities”的结束元素“值”。从命名空间“”中找到元素“值”。

【问题讨论】:

  • 您显然已经连接到 WCF 服务,但您应该添加实际序列化对象的方式。另外,您是否分析了序列化输出并将其与 Microsoft 的规范进行了比较?

标签: php wcf object serialization


【解决方案1】:

所以我的客户毕竟能够让它工作。方法如下:

不像我通常那样简单地为字段赋值:

$DynamicAttributeInfo->Value = $text;

我必须手动创建一个 SOAP 变量,明确定义它的类型和命名空间:

$DynamicAttributeInfo->Value = new SoapVar($text,XSD_STRING,'string','http://www.w3.org/2001/XMLSchema');

这样就按预期通过了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多