【问题标题】:Is there a serialization system for .net that supports reference tracking across streams?.net 是否有支持跨流引用跟踪的序列化系统?
【发布时间】:2016-04-06 16:26:03
【问题描述】:

我想跨多个序列化对象块跟踪对象引用。我知道的序列化器可以跟踪引用,但只能一次序列化一个图作为一个整体。我想部分序列化一个图,然后再序列化它的另一部分或从图中更新一些对象。

我认为下面的代码很好地解释了我的问题 - 我正在寻找一个序列化程序,如果在这里使用它会打印“成功”。

[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 序列化器是一个相当糟糕的选择。

【问题讨论】:

    标签: c# .net serialization


    【解决方案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

    【讨论】:

    • 该序列化程序是否有二进制版本?
    • 不是DataContractSerializer,没有。
    猜你喜欢
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多