2

我正在使用 Microsoft.WindowsAzure.Storage v2.1.0.3。

尝试将TableContinuationToken序列化为XML。

序列化代码为:

String tokenXml;
var serializer = new XmlSerializer(typeof(TableContinuationToken));
using (var writer = new StringWriter())
{
  var writerSettings = new XmlWriterSettings { OmitXmlDeclaration = true, NewLineChars = String.Empty };
  using (var xmlWriter = XmlWriter.Create(writer, writerSettings))
  {
    serializer.Serialize(xmlWriter, token);
  }
  tokenXml = writer.ToString();
}

反序列化代码为:

TableContinuationToken token; 
var serializer = new XmlSerializer(typeof(TableContinuationToken));
using (var stringReader = new StringReader(tokenXml))
{
  token = (TableContinuationToken)serializer.Deserialize(stringReader);
}

很简单。但是当我尝试反序列化令牌时出现以下异常:

System.InvalidOperationException : There is an error in XML document (1, 26).
----> System.Xml.XmlException : Unexpected Element 'ContinuationToken'

从序列化令牌代码中删除标签后工作正常!

可能是 Microsoft.WindowsAzure.Storage v2.1.0.3 中的 BUG?或者我做错了什么?

谢谢。

4

1 回答 1

3

我刚遇到这个问题。您必须在 TableContinuationToken 实例上使用WriteXml()ReadXml()方法,而不是使用您自己的 XmlSerializer实例。

    public static string SerializeToken(TableContinuationToken token)
    {
        string serialized = null;
        if (token != null)
        {
            using (var writer = new StringWriter())
            {
                using (var xmlWriter = XmlWriter.Create(writer))
                {
                    token.WriteXml(xmlWriter);
                }
                serialized = writer.ToString();
            }
        }

        return serialized;
    }

    public static TableContinuationToken DeserializeToken(string token)
    {
        TableContinuationToken contToken = null;
        if (!string.IsNullOrWhiteSpace(token))
        {
            using (var stringReader = new StringReader(token))
            {
                contToken = new TableContinuationToken();
                using (var xmlReader = XmlReader.Create(stringReader))
                {
                    contToken.ReadXml(xmlReader);
                }
            }
        }

        return contToken;
    }

我认为这是因为类和属性上的序列化属性,但我还没有验证这一点。我只知道提供的代码就是解决方案。

于 2013-12-29T20:24:10.100 回答