序列化"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"时跳过元素财产

应该这样做:-

[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");
        }
    }
}