我无法反序列化之前成功序列化的数据

编程入门 行业动态 更新时间:2024-10-11 01:16:50
本文介绍了我无法反序列化之前成功序列化的数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我在 Google 中随机输入最快的序列化 c#",结果得到了 protobuf.我试过了,我觉得我还可以正确序列化,因为我不能反序列化,现在没有办法知道了吗?!

I was randomly typing 'fastest serializing c#' into Google and got protobuf as a result. I tried it and I think I can serialize properly yet since I can't deserilize, there is no way to tell now is there?!

当我试图反序列化时,我得到:

When trying to deserilaize I get :

A first chance exception of type 'ProtoBuf.ProtoException' occurred in protobuf-net.dll

酷.

要序列化的数据:

[ProtoContract] public struct Cow { [ProtoMember(1)] public float Weight{ get; private set; } [ProtoMember(2)] public bool[] HadCowlings{ get; private set; } public Cow(float weight, bool[] babies) : this() { this.Weight = weight; this.HadCowlings= (bool[])babies.Clone(); } ... } [ProtoContract] public class Pasture { [ProtoMember(1)] public Point Position { get; private set; } [ProtoMember(2)] public Cow[] Cows { get; private set; } public static int HerdSize { get; private set; } public static float BoundWidth { get; private set;} public static float BoundHeight { get; private set; } public Pasture(Cow[] Cows, Point farmPosition) { this.Cows = (Cow[])Cows.Clone(); Position = farmPosition; } ... } [ProtoContract] public class Farm { [ProtoMember(1)] public Point FarmIDCoordinates{ get; private set; } [ProtoMember(2)] public List<Pasture> Pastures{ get; private set; } public static float BoundWidth { get; private set; } public static float BoundHeight { get; private set; } public static int FarmSize { get; private set; } public Farm(int x, int y, FarmType fType) { if (fType == RegionType.STANDARD) Pastures = new List<Pasture>(//make a farm!); else Pastures = new List<Pasture>(//What he said); FarmIDCoordinates = new Point(x, y); } ... }

方法:

设置:

using (ObjectSerializer serializer = new ObjectSerializer()) { serializer.ProtoSerialize<Farm>(farm.ToString() + ".bin", aFarm) }

获取:

using (ObjectSerializer serializer = new ObjectSerializer()) { try { farmsIOwn.Add(serializer.ProtoDeserialize<Farm>( farmLat.X.ToString() + "_" + farmLong.Y.ToString() + ".bin")); } catch { // make me a dummy farm, crashing is for dummies } }

ObjectSerializer:

public void ProtoSerialize<T>(string fileName, T objectGraph) { using (var stream = File.Open(fileName, FileMode.Create)) { Serializer.Serialize<T>(stream, objectGraph); } } public T ProtoDeserialize<T>(string fileName) { T objectGraph; using (var stream = File.Open(fileName, FileMode.Open)) { objectGraph = Serializer.Deserialize<T>(stream); } return objectGraph; }

推荐答案

protobuf-net 可以通过多种不同的方式进行配置.默认情况下,它通过无参数构造函数创建对象,因为该选项适用于所有框架.在这个用法上,有点像XmlSerializer.因为您的类型没有构造函数,所以这种用法是行不通的.最简单的选择是添加一个无参数构造函数.要在完整框架上使用,这不需要 public - 所以 private/protected 等构造函数很好 - 但请注意这(private/protected) 不适用于 Silverlight 等.

protobuf-net can be configured in many different ways. By default, it creates objects via a parameterless constructor, because that option that works on all frameworks. In this usage, it is a bit like XmlSerializer. Because your types don't have a constructor, that usage can't work. The simplest option is to add a parameterless constructor. For use on the full framework this does not need to be public - so a private / protected etc constructor is fine - but note that this (private / protected) won't work on Silverlight etc.

下一个选项是完全跳过构造函数 - 很像 DataContractSerializer.这可以通过属性或通过类型模型的运行时配置来完成.为了说明第一个:

The next option is to skip the constructor completely - a lot like DataContractSerializer. This can be done via attributes or via runtime configuration of the type-model. To illustrate the first:

[ProtoContract(SkipConstructor = true)] public class Foo {...}

同样 - 这在大多数框架上都很好用,但有一些它不起作用(框架实用程序方法根本不存在).

Again - this works great on most frameworks, but there are a few where it doesn't work (the framework utility method to do it simply doesn't exist).

最后,您可以提供自己的工厂方法;每个类型的全局.这个工厂方法是一个 static 方法,它返回一个 vanilla 实例(可选地接受诸如序列化上下文、请求类型等).除了提供对构造的完全控制之外,如果您想提供对象池等,这也很有用.此选项适用于所有框架,但需要您编写额外的代码和配置.

Finally, you can provide your own factory methods; either per-type of globally. This factory method is a static method that returns a vanilla instance (optionally accepting things like the serialization-context, requested-type, etc). In addition to providing complete control over construction, this is also useful if you want to provide object-pooling etc. This option works on all frameworks, but requires you to write extra code and configuration.

更多推荐

我无法反序列化之前成功序列化的数据

本文发布于:2023-11-12 13:09:30,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1581593.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列化   数据

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!