2011-08-10 37 views
1

每當標有MessageContract屬性的類的對象被序列化,我看,它看起來爲[MessageBodyMember]構件和下所述消息中單獨的XML元素序列化他們時,跳過的元件。無論如何,直接序列化它們,跳過包裝節點?串行化「MessageBodyMember」屬性

例如,

[System.ServiceModel.MessageContractAttribute(IsWrapped = false)] 
Class A 
{ 
     [MessageBodyMember] 
     public string MyMessage 
     { 
      get; 
      set; 
     } 
} 

當這個被序列化成爲

<Body> 
<MyMessage>....</MyMessage> 
</Body> 

,但我希望它成爲

<Body> 
.... 
</Body> 

我知道這可能是不合理的。有什麼建議麼 ?

+0

你能澄清你想要什麼(即,用一些例子替換...)嗎?例如,是否要將消息看起來像這樣某些字符串? – carlosfigueira

回答

0

這應做到: -

[MessageBodyMember(Name="Body")] 
0

如果我理解你的問題正確的話,你要刪除的<MyMessage>元素和對郵件正文中的字符串本身。那麼,消息合約不適合你。您可以刪除消息合約的外部包裝,但不能刪除個別成員的包裝。

你可以做的是根據你創建的BodyWriter實例創建一個Message對象,並且這個主體寫入器可以以任何想要的形式寫出輸出XML。有關示例,請參閱下面的代碼。

public class StackOverflow_7010654 
{ 
    [MessageContract(IsWrapped = false)] 
    public class MyMC 
    { 
     [MessageBodyMember] 
     public string MyMessage { get; set; } 
    } 
    public static void Test() 
    { 
     TypedMessageConverter tmc = TypedMessageConverter.Create(typeof(MyMC), "Action"); 
     Message msg = tmc.ToMessage(new MyMC { MyMessage = "some string" }, MessageVersion.Soap11); 
     Console.WriteLine(msg); // message with the <MyMessage> element 

     Console.WriteLine(); 

     msg = Message.CreateMessage(MessageVersion.Soap11, "Action", new MyBodyWriter()); 
     Console.WriteLine(msg); // message without the <MyMessage> element 
    } 
    public class MyBodyWriter : BodyWriter 
    { 
     public MyBodyWriter() : base(true) { } 

     protected override void OnWriteBodyContents(XmlDictionaryWriter writer) 
     { 
      writer.WriteString("some string"); 
     } 
    } 
}