Duvida sobre Serializable

Olá pessoal,
vendo um exemplo referente a Serializable , não entendi por que dá erro na linha

os.writeInt(theCollar.getCollarSize());

pois esse atributo é transient e não poderia gravar mas o comando
os.defaultWriteObject(); não iria tratar essa situação ???

Essa é minha duvida ???

se alguém puder me ajudar…

abs

class Collar implements Serializable{
	   private int collarSize;
	   public Collar(int size) { 
		   collarSize = size; 
	   }
	   public int getCollarSize() { 
		   return collarSize; 
	   }
	}
public class Dog implements Serializable{
	   private static transient Collar theCollar;
	   private static int dogSize;
	   public Dog(Collar collar, int size) {
	     theCollar = collar;
	     dogSize = size;
	   }
	   public Collar getCollar() { 
		   return theCollar; 
	   }
	   
	  
       public static void main (String[] args){
		   
		   Collar c = new Collar(3);
		   Dog d = new Dog(c, 8);
		   System.out.println("before: collar size is "
                   + d.getCollar().getCollarSize());
		   try {
			      FileOutputStream fs = new FileOutputStream("testSer.ser");
			      ObjectOutputStream os = new ObjectOutputStream(fs);
			      os.defaultWriteObject();
			      os.writeInt(theCollar.getCollarSize()); 
			      os.close();
			    } catch (Exception e) { 
			    	e.printStackTrace(); 
			   	}
//
			    try {
			        FileInputStream fis = new FileInputStream("testSer.ser");
			        ObjectInputStream ois = new ObjectInputStream(fis);
			        d = (Dog) ois.readObject();
			        ois.close();
			      } catch (Exception e) { e.printStackTrace(); }

			    //  System.out.println("after: collar size is "
			    //                     + d.getCollar() .getCollarSize());
			      
			      System.out.println("dogSize="+d.dogSize);
		   
	   }
}
erro:
before: collar size is 3
dogSize=8
java.io.NotActiveException: not in call to writeObject
	at java.io.ObjectOutputStream.defaultWriteObject(Unknown Source)
	at certificacao.licão_8_7.Dog.main(Dog.java:46)
java.io.EOFException
	at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source)
	at java.io.ObjectInputStream.readObject0(Unknown Source)
	at java.io.ObjectInputStream.readObject(Unknown Source)
	at certificacao.licão_8_7.Dog.main(Dog.java:56)

Fiz alguns testes aqui e vi que não é essa linha que dá páu.
Na verdade é a linha logo acima, chamada a "os.defaultWriteObject(); ".
O próprio java diz: "not in call to writeObject ", ou seja a chamada ao método defaultWriteObject() precisa estar dentro do método writeObject() que vc deve sobreescrever quando quer colocar mais coisas na serialização, por exemplo o Collar.collarSize;
Perceba também que vc está tentando serializar mas em nenhum momento vc especifica que quer serializar o Dog d.

O procedimento correto seria:
Dog subscreve o metodo writeObject() e lá dentro pode chamar defaultWriteObject();
No método main vc serializa fazendo a chamada os.writeObject(d);

Releia a seção de Serialização e procure seguir os exemplos do livro ;
Faça seus testes para ir entendendo o que está acontecendo.

[]'s