代码之家  ›  专栏  ›  技术社区  ›  bgs264

C#-当标记之间的空白被分隔时反序列化

  •  0
  • bgs264  · 技术社区  · 7 年前

    我将一些XML发布到AWS中的API网关方法,它与SNS集成。然后向主题订阅一个SQS队列;我有一个C进程,它间歇地轮询队列,需要反序列化XML。

    问题是,XML标记之间的空白最终会在某处被编码,所以制表符变成 \t 新的生产线 \r\n . 但这些最终都是 物理标记 在绳子里面。

    发布到API网关的示例XML:

    <?xml version="1.0" encoding="utf-8"?>
    <ProfileInformation>
        <Username>bgs264</Username>
    </ProfileInformation>
    

    <?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ProfileInformation>\n\t<Username>bgs264</Username>\n</ProfileInformation>
    

    注意,声明中的属性以 \" 最后贴出来的空白是 \t , \r\n

    然而,这些并不是“在调试器中出现的字符串,但实际上是一个制表符” 实际上是这样的 在绳子里。

    所以当我试图反序列化时,使用

    using (var reader = new StringReader(message))
       var myObj = serializer.Deserialize(reader) as ProfileInformation);
    

    InvalidOperationException:XML文档(1,15)中存在错误。

    它指的是第一个 \ 声明中的字符,如 version=\"1.0\"

    我当时的想法是 string.Replace \t 用户的用户名字符串可能是有效的,但实际上是空的 bgs\t264 这里的替换会导致不一致。我想我会举个例子 bgs\\t264 所以一个替代者会让我错误地 bgs\264 例如。

    所以我需要修理这些 \n\t

    值得一提的是,我还有一个用Go编写的lambda,它没有任何问题,只是将完全相同的字符串直接反序列化为XML。所以这是可能的。

    我最初的想法是:

    • 我能在传递字符串之前先解码它吗 反序列化?我试过了 HttpUtility.DecodeHtml 但我 别以为我要解码的其实是HTML!
    • 有没有一个不同的XML库可以使用呢?
    0 回复  |  直到 7 年前
        1
  •  1
  •   Charles Mager    7 年前

    我猜,一些google搜索似乎支持这个理论,即您看到的消息已经被转换为JSON&转义序列就是这样的结果。

    理想的方法是调查并防止这种情况发生。我对SNS的了解还不足以建议您指出这是一个非启动程序,因此最简单的方法是在收到消息后将此过程逆转。

    您可以使用一个JSON库,比如 Json.NET 为此:

    var jsonString = string.Format("\"{0}\"", message);
    
    var xmlString = JsonConvert.DeserializeObject<string>(jsonString);
    
    using (var reader = new StringReader(xmlString))
    {
       var profileInformation = (ProfileInformation) serializer.Deserialize(reader);
    }