c# - 如何使用 protobuf-net 进行 xml 序列化?

标签 c# serialization xml-serialization protobuf-net xmlserializer

也许我对连载有什么误解。我想以最快的方式序列化我的 .net 对象。我做了一些谷歌搜索,我发现了 protobuf。我的第一个问题是 ProtoBuf.Net 具有 xml 序列化的能力。如果有,我可以将它用于 xml 序列化吗。

我的模型:


    [XmlType]
public class CT {
    [XmlElement(Order = 1)]
    public int Foo { get; set; }
}
[XmlType]
public class TE {
    [XmlElement(Order = 1)]
    public int Bar { get; set; }
}
[XmlType]
public class TD {
    [XmlElement(Order = 1)]
    public List CTs { get; set; }
    [XmlElement(Order = 2)]
    public List TEs { get; set; }
    [XmlElement(Order = 3)]
    public string Code { get; set; }
    [XmlElement(Order = 4)]
    public string Message { get; set; }
    [XmlElement(Order = 5)]
    public DateTime StartDate { get; set; }
    [XmlElement(Order = 6)]
    public DateTime EndDate { get; set; }
}

我的序列化器:

            CT ct = new CT() { Foo = 1 };
        List<CT> list = new List<CT>();
        list.Add(ct);
        TE te = new TE() { Bar = 2 };
        List<TE> list2 = new List<TE>();
        list2.Add(te);
        TD td = new TD() { Code = "Test",Message = "Yusuf",StartDate = DateTime.Now,EndDate = DateTime.Now,CTs = list,TEs = list2 };
        List<TD> list3 = new List<TD>();
        list3.Add(td);
        Stopwatch stopwatch5 = new Stopwatch();
        stopwatch5.Start();

        string str = String.Empty;
             using (MemoryStream stream = new MemoryStream()) 
        {
            byte[] data =  Serialize(list3);
            XmlDocument doc = new XmlDocument();
            string xml = Encoding.UTF8.GetString(data); <--SHOULD CREATE XML
            doc.LoadXml(xml);
           // str = Convert.ToBase64String(stream.GetBuffer(),0,(int)stream.Length); 
        } 
        stopwatch5.Stop();
        Console.WriteLine(((double)(stopwatch5.Elapsed.TotalMilliseconds * 1000000) / 1000000).ToString("0.00 ns"));
        Console.Read();

    }
    public static byte[] Serialize(List<TD> tData) {
        using(var ms = new MemoryStream()) {
            ProtoBuf.Serializer.Serialize(ms,tData);
            return ms.ToArray();
        }
    }

    public static List<TD> Deserialize(byte[] tData) {
        using(var ms = new MemoryStream(tData)) {
            return ProtoBuf.Serializer.Deserialize<List<TD>>(ms);
        }
    }

它应该创建 xml 作为“string xml = Encoding.UTF8.GetString(data);”的结果。但是没有。我如何生成 xml 结果?

最佳答案

Protocol Buffer 不会将对象序列化为 XML。
它产生二进制数据。而且它有自己的一套属性。
检查这个answer

Protobuf-net 的序列化/反序列化是否比 XML 更快?是的,by far .
然而,对于大多数任务来说,XmlSerializer 足够快。 不过在使用时需要提醒的是:

  • XmlSerializer 实例正在动态生成代码并将此代码编译成程序集。
  • 此生成的程序集随后用于非常快速地序列化和反序列化您的对象。
  • 因此您应该缓存 XmlSerializer 的实例(并避免重新创建它们)
  • 您可以通过调用 Serialize 和 Deserialize 来预热,以初始化内部对象并 jit 它们。

您甚至可以通过自己生成自动生成的程序集来更进一步,但是您应该记住每次更改对象时都要重新生成(它可以通过 MsBuild 任务自动生成)。 您还可以查看进一步的优化:

关于c# - 如何使用 protobuf-net 进行 xml 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32843291/

相关文章:

c# XML序列化为元素赋值

c# - XML 反序列化和松散数组项

c# - Redis Sentinel C# 客户端

Android native 库 - 写入日志的序列化方式

c# - 从 VS2012 升级到 VS2013 后 SGEN 不起作用

c# - 如何在 WinRT 的应用 ViewModel 中异步使用 json.net?

c# - 将 C# 锯齿状数组转换为数组并再次返回

c# - 如何忽略 [XMLIgnore] 属性

c# - 在 WinForms 应用程序中放置功能代码的位置

c# - 从 Azure 函数访问嵌套 Json 设置