Serialization of my (simple) custom inspector

I am writing this inspector for the editor that allows me to prototype different enemies and a similar one for attacks.
That allow me to define a variable for the enemy’s Prefab, SightRange ect…
I have never fiddled with serialization before and I am now trying to get to grips with it.
Here is the class for the editor

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;


[System.Serializable][CustomEditor(typeof(CharacterDictionary))]
public class CharacterDesigner : Editor {
    public enum tabs
    {
        Characters,
        Inspector
    }
    tabs ActiveTab;

    [SerializeField]
    List<CharacterPrototype> Characters = new List<CharacterPrototype>();
    CharacterPrototype ActiveSelection;

    bool[] Attacks;

    string visRange = "", user = "";
    AttackDictionary AD;

    public override void OnInspectorGUI()
    {
        CharacterDictionary myScript = (CharacterDictionary)target;
        GUILayout.BeginHorizontal ();
        if(GUILayout.Button("Characters", GUILayout.Width(125)))
        {
            ActiveTab = tabs.Characters;
        }
        if(GUILayout.Button("Inspector", GUILayout.Width(125)))
        {
            ActiveTab = tabs.Inspector;
        }
        GUILayout.EndHorizontal ();
        if(ActiveTab == tabs.Characters)
        {
            if(GUILayout.Button("+", GUILayout.Width(25), GUILayout.Height(25)))
            {
                AD = GameObject.Find ("Manager").GetComponent<AttackDictionary> ();
                AD.DestroyDictionary();
                AD.CreateDictionary();
                List<AttackPrototype> Attacks = new List<AttackPrototype>();
                Attacks.Add (AD.FindItem("Attack High"));
                Characters.Add ( new CharacterPrototype("Default", Attacks, null, 5.0f));
            }

            foreach(CharacterPrototype Char in Characters)
            {
                if(GUILayout.Button(Char.CharacterName, GUILayout.Width(250)))
                {
                    ActiveSelection = Char;
                }
            }
        }
        else if(ActiveTab == tabs.Inspector && ActiveSelection != null)
        {
           
            if(GUILayout.Button("Reset Attacks", GUILayout.Width(250)))
            {
                Attacks = null;
            }
            GUILayout.BeginVertical ();
            GUILayout.Label("Character Name: ");
            user = GUILayout.TextField(user);
            ActiveSelection.CharacterName = user;
            GUILayout.Label("Sight Range: ");
            visRange = GUILayout.TextField(visRange);
            GUILayout.Label("Character Model: ");
            float.TryParse(visRange, out ActiveSelection.SightRange);
            GUILayout.EndVertical ();

            ActiveSelection.CharacterModel = (GameObject) EditorGUILayout.ObjectField(ActiveSelection.CharacterModel, typeof(GameObject) , false);
           
            GUILayout.Label(" ");
            GUILayout.BeginHorizontal ();
            GUILayout.BeginVertical ();
            int index = 0;
            foreach(var Attack in AD.Attacks.Values)
            {
                GUILayout.Label(Attack.AttackName);
                index++;
            }
            GUILayout.EndVertical ();
            GUILayout.BeginVertical ();
            if(Attacks == null)
            {
                Attacks = new bool[index];
            }
            for(int i = 0 ; i < index; i++)
            {
                Attacks[i] = GUILayout.Toggle (Attacks[i], "");
            }
            GUILayout.EndVertical ();
            GUILayout.EndHorizontal ();
            GUILayout.Label(" ");
            GUILayout.Label("Character Name = " + ActiveSelection.CharacterName);
            GUILayout.Label("Sight Range = " + ActiveSelection.SightRange);
        }
    }
}

What I really need is to serialize the variable Characters
If that remained constant everything is reading from there

help would be great