我无法反序列化先前成功序列化的数据
本文关键字:成功 序列化 数据 反序列化 | 更新日期: 2023-09-27 18:10:26
我在Google中随机输入"最快序列化c#",结果得到了protobuf.net。我试过了,我想我可以正确地连载了,因为我不能反序列化,没有办法告诉现在有吗?!
当试图反序列化时,我得到:
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等上工作。
下一个选项是完全跳过构造函数——很像DataContractSerializer
。这可以通过属性或类型模型的运行时配置来实现。为了说明第一个:
[ProtoContract(SkipConstructor = true)]
public class Foo {...}
这在大多数框架上都能很好地工作,但也有一些框架不起作用(框架实用程序方法根本不存在)。
最后,你可以提供你自己的工厂方法;每个类型或全局。这个工厂方法是一个static
方法,它返回一个普通实例(可选地接受序列化上下文、请求类型等)。除了提供对构造的完全控制之外,如果您想提供对象池等,这也很有用。此选项适用于所有框架,但需要编写额外的代码和配置。
protobuf-net的要求之一是提供默认构造函数。因为Farm和牧场对象的构造函数都包含参数。不再有默认构造函数。你必须提供一个。
添加一个以获取您的数据。
Farm() {}
Pastures() {}