Ajuda com serialização

Boa tarde galera, estou precisando de ajuda com serialização. Minha situação é o seguinte, tenho uma classe chamada PessoaDAO e ContaDAO(os controllers), entao na classe modelo Pessoa eu tenho um ArrayList de contas. Dentro de ContaDAO eu tenho um ArrayList tambem de contas(assim eu dou um setContas() para a classe Pessoa). O problema é quando eu crio duas pessoas e crio uma conta pra cada, na hora que eu peço pra ver as contas que uma pessoa tem, o programa me imprime todas as contas desta pessoa e das outras. Como eu posso serializar de maneira que o programa possa separar as contas?

Classe Pessoa:
package b2.Model;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.io.Serializable;

/**
 *
 * @author João Gabriel
 */
public class Pessoa implements Serializable {

    private String nome;
    private String dtn;
    private String sexo;
    private String cpf;
    private static ArrayList<Conta> contas = new ArrayList<>();

    /**
     * @return the nome
     */
    public String getNome() {
        return nome;
    }

    /**
     * @param nome the nome to set
     */
    public void setNome(String nome) {
        this.nome = nome;
    }

    /**
     * @return the dtn
     */
    public String getDtn() {
        return dtn;
    }

    /**
     * @param dtn the dtn to set
     */
    public void setDtn(String dtn) {
        this.dtn = dtn;
    }

    /**
     * @return the sexo
     */
    public String getSexo() {
        return sexo;
    }

    /**
     * @param sexo the sexo to set
     */
    public void setSexo(String sexo) {
        this.sexo = sexo;
    }

    /**
     * @return the cpf
     */
    public String getCpf() {
        return cpf;
    }

    /**
     * @param cpf the cpf to set
     */
    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    /**
     * @return the contas
     */
    public static ArrayList<Conta> getContas() {
        return contas;
    }

    /**
     * @param contas the contas to set
     */
    public void setContas(Conta contas) {
        this.contas.add(contas);
    }

    /*public void excluirContas(Conta conta) {
        contas.remove(conta);
    }*/

    @Override
    public String toString() {
        return "\nNome: " + nome
                + "\nData de Nascimento: " + dtn
                + "\nSexo: " + sexo
                + "\nCPF: " + cpf;
    }

    public String infoConta() {
        if(contas != null){
            return "\nNome do Cliente:" + nome + 
                "\n"+ contas;
        }else{
            return null;
        }
    }

    public void excluirContas() {
        contas.remove(getContas());
    }
    
    public static void serializarContasp(){
        try {
            FileOutputStream fos = new FileOutputStream("C:\\Users\\AspireV5\\Documents\\NetBeansProjects\\Banco1\\src\\b2\\Controle\\conta.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(contas);
            oos.close();
            fos.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }      
    }
    public static Object carregarObjetoContap(){
        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\AspireV5\\Documents\\NetBeansProjects\\Banco1\\src\\b2\\Controle\\conta.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object obj = ois.readObject();
            ois.close();
            fis.close();
            return obj;
        } catch (IOException ioe) {
            //System.out.println("\nPrimeira vez sendo utilizado, não há Contas salvas!");
            return null;
        } catch (ClassNotFoundException c) {
            System.out.println("\nClasse não encontrada!");
            c.printStackTrace();
            return null;
        }
    }
    
    public static void carregarContas(){
        ArrayList<Conta> conta = (ArrayList<Conta>)carregarObjetoContap();
        if(conta!=null){
            contas = conta;     
        }
    }
}

Classe ContaDAO:

package b2.Controle;

import b2.Model.Conta;
import b2.Model.Pessoa;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Scanner;

/**
 *
 * @author AspireV5
 */
public class ContaDAO {

    private static ArrayList<Conta> list2 = new ArrayList<>();
    Conta c;
    Conta buscaConta = null;
    PessoaDAO pessoa = new PessoaDAO();
    Scanner scan = new Scanner(System.in, "latin1");
    Pessoa buscaPessoa;

    public void addConta(PessoaDAO pDAO) {

        Pessoa p = pDAO.getPessoa();

        if (p != null) {
            System.out.println("Digite uma Senha para a Conta: ");
            int senha = scan.nextInt();
            System.out.println("Digite o Saldo Inicial para Conta: ");
            double saldo = scan.nextDouble();
            System.out.println("Digite a Agência da Conta: ");
            int agencia = scan.nextInt();
            scan.nextLine();

            c = new Conta();

            c.setSenha(senha);
            c.setSaldo(saldo);
            c.setAgencia(agencia);
            list2.add(c);

            p.setContas(c);
            System.out.println("Conta cadastrada com sucesso!");

        } else {
            System.out.println("\nCliente não foi encontrado\n");
        }
    }

    public void atualizarConta() {
        System.out.println("Digite o Numero da Conta para buscar: ");
        int busca = scan.nextInt();

        for (Conta conta : list2) {
            if (busca == conta.getNumero()) {
                buscaConta = conta;
                break;
            } else {
                buscaConta = null;
            }
        }
        if (buscaConta == null) {
            System.out.println("\nConta não encontrada!");
        } else {
            System.out.println("Digite uma nova Senha: ");
            int senha = scan.nextInt();
            System.out.println("Digite uma nova Agência para a Conta");
            int agencia = scan.nextInt();

            buscaConta.setSenha(senha);
            buscaConta.setAgencia(agencia);
            System.out.println("Conta atualizada com sucesso!");
        }
    }

    public void removerConta() {

        System.out.println("Digite o Número da Conta para buscar: ");
        int busca = scan.nextInt();
        Pessoa p = new Pessoa();

        for (Conta conta : list2) {
            if (busca == conta.getNumero()) {
                list2.remove(conta);
                //p.excluirContas();
                break;
            } else {
                buscaConta = null;
                System.out.println("\nConta não Encontrada");
            }
        }
    }

    public void fazerDeposito() {

        System.out.println("Digite o Número da Conta: ");
        int busca = scan.nextInt();

        for (Conta conta : list2) {
            if (busca == conta.getNumero()) {
                buscaConta = conta;
                break;
            } else {
                buscaConta = null;
            }
        }
        if (buscaConta == null) {
            System.out.println("\nConta não encontrada!");
        } else {
            System.out.println("Digite o Valor que deseja Depositar: ");
            double valor = scan.nextDouble();

            buscaConta.depositarDinheiro(valor);
        }
    }

    public void fazerSaque() {

        System.out.println("Digite o Número da Conta: ");
        int busca = scan.nextInt();

        for (Conta conta : list2) {
            if (busca == conta.getNumero()) {
                buscaConta = conta;
                break;
            } else {
                buscaConta = null;
            }
        }
        if (buscaConta == null) {
            System.out.println("\nConta não encontrada!");
        } else {
            System.out.println("Digite o Valor que deseja Sacar: ");
            double valor = scan.nextDouble();

            buscaConta.sacarDinheiro(valor);
        }
    }

    public void fazerTransferencia() {

        System.out.println("\nDigite o Número da sua Conta: ");
        int conta1 = scan.nextInt();

        Conta buscaConta1 = null;

        for (Conta conta : list2) {
            if (conta1 == conta.getNumero()) {
                buscaConta1 = conta;
                System.out.println(buscaConta1);
                break;
            } else {
                buscaConta1 = null;
            }
        }
        System.out.println("\nDigite o Número da Conta que deseja Transferir: ");
        int conta2 = scan.nextInt();

        Conta buscaConta2 = null;
        for (Conta conta : list2) {
            if (conta2 == conta.getNumero()) {
                buscaConta2 = conta;
                System.out.println(buscaConta2);
            } else {
                buscaConta2 = null;
            }
        }

        System.out.println("\nDigite o Valor que deseja Transferir: ");
        double valor = scan.nextDouble();

        if (valor <= buscaConta1.getSaldo() && valor > 0) {
            buscaConta1.sacarDinheiro(valor);
            buscaConta2.depositarDinheiro(valor);
            System.out.println("\nTransferência feita com Sucesso!");
        } else {
            System.out.println("\nSaldo Insuficiente!");
        }
    }

    public Conta verConta(int numero) {

        for (Conta conta : list2) {
            if (numero == conta.getNumero()) {
                buscaConta = conta;
            } else {
                buscaConta = null;
            }
        }
        if (buscaConta == null) {
            return null;
        } else {
            return buscaConta;
        }
    }

    public Conta verificarAcesso() {

        System.out.println("Digite o Número de sua Conta");
        int numero = scan.nextInt();

        System.out.println("Digite a Senha da sua Conta");
        int senha = scan.nextInt();

        for (Conta conta : list2) {
            if (conta.getNumero() == numero && conta.getSenha() == senha) {
                buscaConta = conta;
                break;
            } else {
                buscaConta = null;
            }
        }
        if (buscaConta == null) {
            return null;
        } else {
            return buscaConta;
        }
    }
    
    public static void serializarContasc(){
        try {
            FileOutputStream fos = new FileOutputStream("C:\\Users\\AspireV5\\Documents\\NetBeansProjects\\Banco1\\src\\b2\\Controle\\contac.txt");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(list2);
            oos.close();
            fos.close();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }      
    }
    public static Object carregarObjetoContac(){
        try {
            FileInputStream fis = new FileInputStream("C:\\Users\\AspireV5\\Documents\\NetBeansProjects\\Banco1\\src\\b2\\Controle\\contac.txt");
            ObjectInputStream ois = new ObjectInputStream(fis);
            Object obj = ois.readObject();
            ois.close();
            fis.close();
            return obj;
        } catch (IOException ioe) {
            //System.out.println("\nPrimeira vez sendo utilizado, não há Contas salvas!");
            return null;
        } catch (ClassNotFoundException c) {
            System.out.println("\nClasse não encontrada!");
            c.printStackTrace();
            return null;
        }
    }
    
    public static void carregarContasc(){
        ArrayList<Conta> contas = (ArrayList<Conta>)carregarObjetoContac();
        if(contas!=null){
            list2 = contas;
            //System.out.println(list2);
        }else{
            System.out.println("\nAinda não tem Contas cadastradas");
        }
    }
}

Velhino, seu list de contas é static, todos objetos pessoa vão ter mesmo valor

Eu coloquei static pois eu preciso fazer métodos para carregar e salvar, entao quando o programa é iniciado eu devo ter um método carregar() e quando fecho um salvar.Se eu tirar static na hora de colocar na main da erro.

Pois terá de resolver de outro jeito, isso tá errado.
É aquela gambiarra q voltou pra lhe assombrar, rsrsrs

Consegui arrumar, agora o programa separa as contas da pessoa certo, mas meu atributo conta não está incrementando. Por exemplo, eu crio uma conta pra uma pessoa, a primeira logicamente seria 01,quando eu fecho o programa, executo de novo, crio uma nova conta para a pessoa, ela deveria ser a conta 02, mas ela fica como 01. Sendo que na minha classe Conta eu coloquei o atributo numero para incrementar a cada conta nova.

qualquer valor q quiser manter ao fechar o programa deve salvar fora dele, banco ou arquivo