I wrote a generic List type. How do I make the List serializable? My main concern is with the GetObjectData()
method.
The following is my List class with its methods. I have done XML serialization before with the List<>
that is already available in C# but I just don't know what I should write in the GetObjectData()
method. Some form of foreach
loop maybe?
class Liste<T> : IEnumerable, ISerializable
{
List_Element<T> First;
List_Element<T> Last;
int position = -1;
public T this[int index]
{
get
{
return GetAt(index);
}
set
{
//Person p = new Person();
//InsertAt(index, p);
}
}
public bool MoveNext()
{
position++;
if (currentElement == null)
{
currentElement = First;
}
else
{
currentElement = currentElement.Next;
}
return (position < Count);
}
internal bool MovePrev()
{
position--;
if (currentElement == null)
{
currentElement = Last;
}
else
{
currentElement = currentElement.Prev;
}
return currentElement != null;
}
private List_Element<T> currentElement;
public T Current
{
get
{
return currentElement.Data;
}
}
public void Add(T data)
{
List_Element<T> listelement = new List_Element<T>();
listelement.Data = data;
if (First == null)
{
First = listelement;
Last = listelement;
}
else
{
Last.Next = listelement;
listelement.Prev = Last;
Last = listelement;
}
Count++;
}
public int Count { get; private set; }
public void NeueListe()
{
First = null;
}
public void InsertEnd(T data)
{
List_Element<T> ende = new List_Element<T>();
ende.Data = data;
if (First == null)
{
First = ende;
Last = ende;
}
else
{
Last.Next = ende;
ende.Prev = Last.Prev;
Last = ende;
ende.Prev.Prev = Last.Prev.Prev;
}
Count++;
}
public void Reset()
{
position = -1;
}
public T GetAt(int index)
{
List_Element<T> laufvariable;
laufvariable = First;
for (int i = 0; i < index; i++)
{
laufvariable = laufvariable.Next;
}
if (index == 0)
{
return laufvariable.Data;
}
else
{
return laufvariable.Data;
}
}
public void InsertAt(int index, T data)
{
List_Element<T> insertElement = new List_Element<T>();
insertElement.Data = data;
if (index == 0)
{
insertElement.Next = First;
First = insertElement;
}
else
{
List_Element<T> laufVariable;
laufVariable = First;
for (int i = 0; i < index - 1; i++)
{
laufVariable = laufVariable.Next;
}
insertElement.Next = laufVariable.Next;
laufVariable.Next = insertElement;
insertElement.Prev = laufVariable;
}
if (insertElement.Next == null)
{
Last = insertElement;
}
else
{
insertElement.Next.Prev = insertElement;
}
}
public void RemoveAt(int index)
{
if (index == 0)
{
if (Count == 1)
{
First = null;
Last = null;
Count--;
return;
}
//First = First.Next;
//First.Prev = null;
else
{
First = First.Next;
First.Prev = null;
Count--;
}
}
else
{
List_Element<T> laufvariable;
laufvariable = First;
for (int i = 0; i < index - 1; i++)
{
laufvariable = laufvariable.Next;
}
if (laufvariable.Next.Next == null)
{
Last = laufvariable;
laufvariable.Next = null;
}
else
{
laufvariable.Next = laufvariable.Next.Next;
laufvariable.Next.Prev = laufvariable;
}
Count--;
}
}
public void Removelast(int index)
{
List_Element<T> laufvariable;
laufvariable = First;
for (int i = 0; i < index - 1; i++)
{
laufvariable = laufvariable.Next;
}
laufvariable = null;
}
public IEnumerator GetEnumerator()
{
if (First == null)
{
yield break;
}
if (First == Last)
{
yield return First;
MoveNext();
}
MoveNext();
while (currentElement != null)
{
yield return currentElement;
MoveNext();
}
if (currentElement == null)
{
Reset();
yield break;
}
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
// What to do here?
}