Serializing a stack to XML in C#
Serializing a class to XML in C# is straightforward; most collections can be easily serialized also.
Something like the following will work in most scenarios -
This also works nicely with lists, arrays and the like. But if you want to serialize a stack to XML you get an
You must implement a default accessor on System.Collections.Generic.Stack`1[[System.String, mscorlib, Version=18.104.22.168, Culture=neutral, PublicKeyToken=b77a5c561934e089]] because it inherits from ICollection.
There might be some third party libraries out there that will work but I’m going to stick with Microsoft technologies.
So I need to add an accessor to a stack, but a quick look at the
System.Collections.Generic.Stack class using dotPeek shows that the underlying collection is a private array.
I could inherit from the Stack class, access the private array through reflection and add the required interface and methods to my class, or I could write my own stack class, but I don’t like these approaches.
An alternative is to start with a collection that can be serialized to XML successfully and add the required stack functionality,
push, to it. This a relatively straightforward approach, is easy to understand and provides a familiar interface. I chose to use the List as my base class.
A problem with this approach is that order that items come out of the enumerator is the opposite from a traditional stack, but as long as the stack is accessed using
push it will work the same. Compromises have to be accepted with mixing the features of two different types.
If you have never deserialized a stack then you can just use the
StackList with no problems.
If you are used to working with stack, you’ll know that a stack create from another Stack will have its contents reversed. To overcome this you can call the
Reverse method on the new stack. This is due to the way the stack constructor is written.
If you want to overcome this issue you will need to implement your own enumerator functionality, this is not very difficult, but I didn’t need to do it for my purposes so I’m not including it here.
Be careful as you create your own types that inherit from Microsoft types, especially when you alter how parts of them work!
Every step you take away from the standard approach you are getting in to trouble, it might not be apparent immediately, but it will catch up with you.
StackList is a cross between and a stack and list that behaves in some particular/peculiar ways that suit me for a for a limited purpose, I don’t plan to use this code widely.