我想跟踪多个序列化对象块的对象引用。我知道的序列化程序可以跟踪引用,但只能一次序列化一个图形。我想部分地序列化一个图形,然后再序列化它的另一部分或者从图形中更新一些对象。
我认为下面的代码很好地解释了我的问题 - 我正在寻找能够打印出成功"成功"如果它在这里使用。
[Serializable]
class TestClass
{
public string Identifier;
public TestClass Reference;
}
class Program
{
static void Main(string[] args)
{
//some test data
TestClass t1 = new TestClass();
t1.Identifier = "t1";
TestClass t2 = new TestClass();
t2.Reference = t1;
t2.Identifier = "t2";
BinaryFormatter formatter = new BinaryFormatter(); //replace this with something that works ^^
MemoryStream stream = new MemoryStream(1024);
formatter.Serialize(stream, t1);
//possibly do lots of things inbetween these two, including,
//but not limited to, switching streams, writing other things
//on the stream etc.
formatter.Serialize(stream, t2);
stream.Position = 0;
object copy1 = formatter.Deserialize(stream);
object copy2 = formatter.Deserialize(stream);
if (((TestClass)copy2).Reference == copy1)
{
Console.WriteLine("Success");
}
else
{
Console.WriteLine("Failure");
}
Console.ReadLine();
}
}
我的用例基本上是我想通过网络发送对象并保持引用不变。我已经研究过protobuf-net并且已经围绕这个问题编写了一些解决方法,但是它们在复杂性方面已经失控了。我的问题是:是否有一个(良好的)序列化库允许我跟踪反序列化方法的一次调用中的引用?或者我错过了一些简单的技术来使用现有的序列化器来实现这一目标?或者我必须自己写这样的东西?
编辑:澄清:这是游戏的网络,因此速度和紧凑性是一个问题。这意味着XML / JSON序列化程序是一个相当糟糕的选择。
答案 0 :(得分:1)
DataContracts可以提供此功能。基本上你会用[DataContract(IsReference=true)]
装饰一个类。此外,有关DataContracts的好消息是,默认情况下它们已经融入WCF,因此您已经拥有了与项目一起使用的通信层。
请参阅此问题了解更多信息。
Circular references preventing serialization of object graph
这里有关于MSDN网站的更多信息:
https://msdn.microsoft.com/en-us/library/hh241056(v=vs.100).aspx