2013-01-06 35 views
0

我的WCF服務可以接受請求,通過傳遞包裹在一個對象的值和DynamicAttributeType枚舉指定類型,像這樣動態更新場:如何序列化PHP中的「對象」類型以發送到WCF服務?

[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] => [Message] =>結束元素值'names''http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'expected。Found text'test'第2行,位置725.

2)第二卷帶(半成功):空類

<?php 
class testText() { 
} 

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

的新對象有沒有WCF例外這段時間,但沒有價值實際上是通過和我的代碼結束了「對象。的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'預期的結束元素'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] => stdClass的對象 ( [HELPLINK] => [的InnerException] => stdClass的對象 ( [HELPLINK] => [的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] => stdClass的對象 ( [HELPLINK] => [的InnerException] => stdClass的對象 ( [HELPLINK] => [的InnerException] => [消息] =>從命名空間'http://schemas.datacontract.org/2004/07/XXX.XXX.XXXService.Common.Entities'預期的結束元素'Value'。從命名空間''找到元素'Value'。

+0

你顯然已經連接到WCF服務工作,但你應該添加你如何實際序列化你的對象。另外,您是否分析了序列化輸出並將其與Microsoft的規範進行了比較? – dualed

回答

0

因此,我的客戶能夠在a後繼續工作二。具體方法如下:

而不是明明白白價值分配到外地,因爲我通常做的:我

$DynamicAttributeInfo->Value = $text; 

曾明確手動創建SOAP變量定義它的類型和命名空間:

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

並以這種方式通過預期。

相關問題