序列化"MessageBodyMember"时跳过元素财产
本文关键字:quot 元素 财产 MessageBodyMember 序列化 | 更新日期: 2023-09-27 18:04:56
每当序列化带有MessageContract属性的类的对象时,我看到它查找[MessageBodyMember]成员并将它们序列化到消息中单独的XML元素下。是否有跳过包装器节点直接序列化它们的方法?
。
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
Class A
{
[MessageBodyMember]
public string MyMessage
{
get;
set;
}
}
当它被序列化时,它变成
<Body>
<MyMessage>....</MyMessage>
</Body>
但是我想让它变成
<Body>
....
</Body>
我知道这可能不合逻辑。有什么建议吗?
应该这样做:-
[MessageBodyMember(Name="Body")]
如果我正确理解您的问题,您希望删除<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");
}
}
}