Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serialization - Viewing the Object Graph from a Stream

I'm wondering if there's a way in which I can create a tree/view of a serialised object graph, and whether anyone has any pointers? EDIT The aim being that should we encounter a de-serialization problem for some reason, that we can actually view/produce a report on the serialized data to help us identify the cause of the problem before having to debug the code. Additionally I want to extend this in the future to take two streams (version 1, version 2) and highlight differences between the two of them to help ensure that we don't accidently remove interesting information during code changes. /EDIT

Traditionally we've used Soap or XML serialization, but these are becoming too restricted for our needs, and Binary serialization would generally do all that we need. The reason that this hasn't been adopted, is because it's much harder to view the serialized contents to help fix upgrade issues etc.

So I've started looking into trying to create a view on the serialized information. I can do this from an ISerializable constructor to a certain extent :

public A(SerializationInfo info, StreamingContext context)
{}

Given the serialization info I can reflect the m_data member and see the actual serialized contents. The problem with this approach is

  1. It will only display a branch from the tree, I want to display the entire tree from the root and it's not really possible to do from this position.
  2. It's not a convenient place to interrogate the information, I'd like to pass a stream to a class and do the work there.

I've seen the ObjectManager class but this works on an existing object graph, whereas I need to be able to work from the stream of data. I've looked through the BinaryFormatted which uses an ObjectReader and a __BinaryParser, hooking into the ObjectManager (which I think will then have the entire contents, just maybe in a flat list), but to replicate this or invoke it all via reflection (2 of those 3 classes are internal) seems like quite a lot of work, so I'm wondering if there's a better approach.

like image 822
Ian Avatar asked Nov 10 '11 11:11

Ian


People also ask

What is the serialization of an object graph?

Designer serialization is the process of converting an object graph into a source file that can later be used to recover the object graph. A source file can contain code, markup, or even SQL table information. System.Text.Json overview Shows how to get the System.Text.Json library.

What is the process of serialization?

This illustration shows the overall process of serialization: The object is serialized to a stream, which carries not just the data, but information about the object's type, such as its version, culture, and assembly name. From that stream, it can be stored in a database, a file, or memory.

What is the difference between serialization and storing properties in table?

Effectively, storing the properties of an object into a table is a form of serialisation. You can make up your own. But in general, if you are saving the state of your object somewhere, and then reading it back again into a 'live' object in your runtime, you are serialising it.

What is a serialversionuid?

The Serialization runtime associates a version number with each Serializable class called a SerialVersionUID, which is used during Deserialization to verify that sender and receiver of a serialized object have loaded classes for that object which are compatible with respect to serialization.


1 Answers

You could put a List<Child class> in every parent class (Even if there the same)

and when you create a child you immediately place it in that list or better yet declare it whilst adding it the list

For instance

ListName.Add(new Child(Constructer args));

Using this you would serialize them as one file which contains the hierarchy of the objects and the objects themselves.

If the parent and child classes are the same there is no reason why you cannot have dynamic and multi leveled hierarchy.

like image 81
BananaPoop Avatar answered Sep 28 '22 07:09

BananaPoop