如何在PHP中序列化“对象”类型以发送到WCF服务?

时间:2013-01-06 08:36:53

标签: php wcf object serialization

我的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] =&gt; stdClass对象                                  (                                      [HelpLink] =&gt;                                      [InnerException] =&gt;                                      [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。找到文本'测试'。第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] =&gt; stdClass对象                          (                              [HelpLink] =&gt;                              [InnerException] =&gt; stdClass对象                                  (                                      [HelpLink] =&gt;                                      [InnerException] =&gt;                                      [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'String'。

<?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] =&gt; stdClass对象                          (                              [HelpLink] =&gt;                              [InnerException] =&gt; stdClass对象                                  (                                      [HelpLink] =&gt;                                      [InnerException] =&gt;                                      [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'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] =&gt; stdClass对象                          (                              [HelpLink] =&gt;                              [InnerException] =&gt; stdClass对象                                  (                                      [HelpLink] =&gt;                                      [InnerException] =&gt;                                      [留言] =&gt;命名空间'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'的结束元素'Value'。从命名空间''找到元素'Value'。

1 个答案:

答案 0 :(得分:0)

所以我的客户终于可以让它工作了。方法如下:

不像我通常那样明确地为字段赋值:

$DynamicAttributeInfo->Value = $text;

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

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

这样它按预期传递。