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?
    }
 
    