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

标签 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;
            }
        }
    }

最佳答案

大多数序列化 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);
        }
    }
}

这不是实际上异步 - 它只是满足所需的 API。如果您有选择,请使用 ValueTask<T>在结果可能经常是同步的情况下更可取/

无论哪种方式,您都应该能够执行以下操作:

var obj = await DeserializeObject<YourType>(someXml);
Debug.WriteLine(obj.Name); // etc

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

关于c# - 将反序列化方法转换为异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11883913/

相关文章:

c# - '使用类型 .. 不支持 NetDataContractSerializer' - 为什么要使用 NetDataContractSerializer?

c# - 如何将 DataReader 中的值放入 List<T>?

c# - 当从另一个项目内部提供 api 时,如何在 Swashbuckle/Swaggerwork 中创建 url 路径?

javascript - jQuery - 可以完成线程/异步吗?

javascript - Node/Express Promise 不会在后续路由请求中被重新调用

c# - Linq 按 2 列(创建和修改)排序,以较大者为准

C - 序列化技术

javascript - HTML 表单 : Which Elements are Sent?

java - 在 JSON 序列化之前更改对象

java - 带参数的 Spring MVC 异步 Controller 实现