Пропуск элемента при сериализации свойства MessageBodyMember - PullRequest
1 голос
/ 10 августа 2011

При сериализации объекта класса, отмеченного атрибутом MessageContract , я вижу, что он ищет [MessageBodyMember] членов и сериализует их в рамках отдельных элементов XML в сообщении. Есть ли какой-либо способ их сериализации напрямую, пропуская узел-обертку?

Например.

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

Когда это сериализовано, оно становится

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

но я хочу, чтобы он стал

<Body>
....
</Body>

Я знаю, что это может быть нелогично. Есть предложения?

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Если я правильно понимаю ваш вопрос, вы хотите удалить элемент <MyMessage> и иметь строку в теле сообщения.Ну, договор на сообщение не будет работать для вас.Вы можете удалить внешнюю оболочку для контракта сообщений, но не оболочки для отдельных участников.

Что вы можете сделать, это создать объект Message на основе созданного вами экземпляра BodyWriter, и этоавтор тела может записать выходной 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");
        }
    }
}
0 голосов
/ 10 августа 2011

Это должно сделать это: -

[MessageBodyMember(Name="Body")]
...