如何序列化一个“对象”在PHP中输入将被发送到WCF服务


How to serialize an "Object" type in PHP to be sent to a WCF Service?

我的WCF服务可以接受一个动态更新字段的请求,通过传递一个对象包装的值和一个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] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。找到文本"test"。第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] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[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] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。从命名空间" .

找到元素" text "
<?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] => stdClass对象([HelpLink] =>[InnerException] => stdClass对象([HelpLink] =>[InnerException] =>[消息]=>结束元素'值'从命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'期望。从命名空间"找到元素" Value "。

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

而不是像我通常做的那样直接给字段赋值:

$DynamicAttributeInfo->Value = $text;

我必须手动创建一个SOAP变量,显式地定义它的类型和名称空间:

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