【发布时间】:2014-10-08 16:43:50
【问题描述】:
我正在尝试序列化然后反序列化其类派生自带有字符串成员字段的Dictionary<string,int> 的对象。
public class TempClass : Dictionary<string, int>
{
public string Version;
public TempClass() { }
}
我编写了一个单元测试来捕获我遇到的问题:使用 protobuf-net 序列化或反序列化(到/从字节 [])时未设置成员字段。当验证反序列化的Version 设置正确时,此测试在最终的Assert 中失败。它始终设置为null,而不是正确的"someVersion"。
[TestClass]
public class serializationTest
{
[TestMethod]
public void TestMethod1()
{
string newVersion = "someVersion";
TempClass original = new TempClass()
{
{"a", 2},
{"b", 3},
{"c", 1},
};
original.Version = newVersion;
byte[] serialized = Serialize(original);
TempClass deserialized = Deserialize(serialized);
// Validate
foreach (var pair in original)
{
Assert.IsTrue(deserialized.ContainsKey(pair.Key));
Assert.AreEqual(pair.Value, deserialized[pair.Key]);
}
Assert.AreEqual(newVersion, original.Version, "original mapping version not set correctly");
Assert.AreEqual(newVersion, deserialized.Version, "deserialized version doesn't match");
}
private static TempClass Deserialize(byte[] serialized)
{
TempClass deserialized;
using (MemoryStream ms = new MemoryStream())
{
ms.Write(serialized, 0, serialized.Length);
ms.Position = 0;
deserialized = Serializer.Deserialize<TempClass>(ms);
}
return deserialized;
}
private static byte[] Serialize(TempClass mapping)
{
byte[] serialized;
using (MemoryStream ms = new MemoryStream())
{
Serializer.Serialize(ms, mapping);
serialized = ms.ToArray();
}
return serialized;
}
}
我已经尝试使用BinaryFormatter 和DataContractSerializer 进行相同的工作,但无济于事。有人可以帮我找出导致此测试失败的错误之处吗?
后续问题:如果我像这样重新定义TempClass,则始终调用构造函数,而不是将成员字段正确设置为原始Version。如何在构造函数不创建新的Version 的情况下进行反序列化,而只复制原始的?
public class TempClass : Dictionary<string, int>
{
public string Version;
public TempClass()
{
Version = DateTime.UtcNow.ToString("s");
}
}
【问题讨论】:
-
感谢您提供简单易用的测试。这样可以节省时间。
标签: c# serialization protobuf-net deep-copy