【问题标题】:Maintain whitespace/line breaks when serializing via ASMX Web Service通过 ASMX Web 服务进行序列化时保持空格/换行符
【发布时间】:2009-07-09 13:03:53
【问题描述】:

我正在对 ASMX Web 服务(传统 .NET SOAP 服务)中的 XML 文档进行一些预处理,以便最终在 Silverlight 前端中使用。

为了便于使用,我正在将该 XML 文档处理为 POCO 对象。对象定义如下:

public class CACDocument : ITextDocument
{
    #region Properties
    public string Title { get; set; }
    public string Text { get; set; }
    public List<Code> CodeList { get; set; }
    public XElement FormatedText { get; set; }
    #endregion

    #region Constructor
    public CACDocument()
    {
        CodeList = new List<Code>();
    }
    #endregion
}

该对象中的 Text 属性包含基本格式化的文本(换行符、空格等...)。提供该属性的 XML 节点如下所示:

<text>
   A TITLE FOLLOWED BY two line breaks


   Some text followed by a line break

   Some more text that might extend for a paragraph or two followed by more line breaks

   Still more text
</text>

一切都很好,并且格式保持不变,正如我所期望的那样,Web 服务会序列化要发送到前端的数据。我猜想为了优化带宽,序列化对象会在发送之前从 Text 属性中去除额外的空格和换行符。在这个特定的例子中,这种格式很重要。有没有办法强制 web 服务保持这种空白/换行格式?

我想我用代码替换了一些有问题的项目,然后在前端转换回来,但这让我觉得有点笨拙。

【问题讨论】:

    标签: c# .net web-services asmx


    【解决方案1】:

    您可以将其序列化为 CDATA 部分:

        [XmlIgnore]
        public string Text { get; set; }
    
        private static readonly XmlDocument _xmlDoc = new XmlDocument();
    
        [XmlElement("Text")]
        public XmlCDataSection TextCData
        {
            get
            {
                return _xmlDoc.CreateCDataSection(Text);
            }
            set
            {
                Text = value.Data;
            }
        }
    

    文本将像这样被序列化:

    <text><![CDATA[A TITLE FOLLOWED BY two line breaks
    
    
       Some text followed by a line break
    
       Some more text that might extend for a paragraph or two followed by more line breaks
    
       Still more text]]></text>
    

    【讨论】:

    • 附加到文档的所有这些 CData 部分的效果是什么?而且,那是线程安全的吗?
    • 说实话,我不知道......也许 XmlDocument 应该是一个局部变量,我只是想避免创建许多 XmlDocument 实例。
    【解决方案2】:

    我猜你指的是 ASMX Web 服务?

    实际上,如果不序列化为字节数组,我认为没有办法做到这一点。或者,您可以实现 IXmlSerializable 并自己完成所有工作。


    你会想要这样的东西:

    public class CACDocument : ITextDocument {
        // ...
        [XmlIgnore]
        public string Text {get;set;}
    
        [XmlText]
        public byte[] TextSubstitute {
            get {return System.Text.Encoding.UTF8.GetBytes(Text);}
            set {Text = System.Text.Encoding.UTF8.GetString(value);}
        }
    }
    

    这没有经过测试,但你会明白的。您也可以使用 [XmlElement] 代替 [XmlText],并指定不同的元素名称。

    【讨论】:

    • 您的假设是正确的。那么,您是说我需要将字符串属性转换为字节数组属性,还是有特定的设置可以让我将字符串显式序列化为字节数组?
    • 史蒂夫,我很好奇 - 您是否尝试过以下 Thomas 的 CDATA 解决方案?我还没有机会尝试。
    • 昨天我赶上了会议。我今天将尝试他的解决方案,稍后会发表评论。
    • 约翰。我在下面尝试了 Thomas 的 CDATA 解决方案,它就像一个魅力。我不知道线程安全,但出于我的目的,它不相关。在任何使用此过程的情况下,这将是对 Web 服务的一次调用,结果将被处理为本地 POCO 对象,并且由于它是 Silverlight 和异步,所以我需要在 proc 完成时触发一个事件,所以在此之前,不可能从另一个线程访问该对象。它还具有限制通过网络发送的数据的额外优势。
    猜你喜欢
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2013-07-02
    相关资源
    最近更新 更多