将反序列化方法转换为异步

Ter*_*nce 9 c# serialization asynchronous

我试图转换此方法,将对象反序列化为使用Async/Await的字符串.

    public static T DeserializeObject<T>(string xml)
    {
        using (StringReader reader = new StringReader(xml))
        {
            using (XmlReader xmlReader = XmlReader.Create(reader))
            {
                DataContractSerializer serializer = new DataContractSerializer(typeof(T));
                T theObject = (T)serializer.ReadObject(xmlReader);
                return theObject;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 15

大多数序列化API没有async实现,这意味着您唯一能做的就是包装同步方法.例如:

public static Task<T> DeserializeObjectAsync<T>(string xml)
{
    using (StringReader reader = new StringReader(xml))
    {
        using (XmlReader xmlReader = XmlReader.Create(reader))
        {
            DataContractSerializer serializer =
                new DataContractSerializer(typeof(T));
            T theObject = (T)serializer.ReadObject(xmlReader);
            return Task.FromResult(theObject);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上并不是异步 - 它只是满足所需的API.如果您有选项,ValueTask<T>在结果可能经常是同步的情况下,最好使用

无论哪种方式,你应该能够做到这样的事情:

var obj = await DeserializeObject<YourType>(someXml);
Debug.WriteLine(obj.Name); // etc
Run Code Online (Sandbox Code Playgroud)

无需知道实际实现是同步还是异步.