คือ การแปลงออปเจคให้อยู่ในรูปของไบต์สตรีม (byte stream) 

1. มีไว้เพื่อใช้ในการเก็บออปเจคไว้ในไฟล์ เพื่อเรียกอ่านและแปลงกลับ (deserialization) เป็นออปเจคในภายหลัง เช่น เราเซฟออปเจคที่เก็บข้อมูล application parameter บางตัวไว้ลงในไฟล์หลังจากโปรแกรมจบ เพื่อว่าในการรันโปรแกรมครั้งต่อไปจะได้อ่านพารามิเตอร์เหล่านั้นกลับเข้ามา วิธีนี้ไม่ค่อยเป็นที่นิยมนัก เนื่องจากมีทางเลือกอื่นๆ เช่น เก็บข้อมูลลงในฐานข้อมูล หรือ ใช้ System.Properties หรือใช้ XMLEncoder (ในจาวา 1.4 ขึ้นไป) 

2. มีไว้สำหรับเป็นวิธีส่งออปเจคนั้นไปยังเครื่องอื่น เนื่องจากออปเจคถูกแปลงเป็นไบต์สตรีม จึงสามารถส่งออปเจคนั้นไปที่เครื่องอื่น (object distribution) ในกรณีผ่านเป็นพารามิเตอร์ในการ invoke ออปเจคข้ามเครื่อง (เช่นที่ใช้ใน RMI) หรือเป็นการ migrate object ไปรันที่เครื่องอื่น เป็นต้น

———

Stream มีโครงสร้างพื้นฐานเป็นสายของ Byte ที่วิ่งมาเรื่อย ๆ เหมือนกระแสน้ำ นั่นหมายความว่าคุณสามารถเก็บข้อมูลจาก Stream หรือเขียนอะไรลงไปใน Stream คุณต้องทำงานเป็น Byte เสมอ คือก้อนข้อมูลขนาด 0-255 หลาย ๆ ก้อนต่อกัน ผมขอเรียกว่า Byte Stream

ต่อมาเราพบว่า Byte Stream มันใช้งานได้ยากลำบากมาก เพราะเราต้องทำอะไรบางอย่างเพื่อแปลง byte ที่ได้จากการอ่านข้อมูลจาก Stream ให้กลายเป็นสิ่งที่ต้องการ เช่น String และในทางกลับกันเวลาเขียนข้อมูลลงไปใน Stream ก็ต้องแปลงมันให้กลายเป็น byte ทีละ byte ก่อน จึงจะสามารถเขียนข้อมูลลงไปใน Stream ได้ จึงมีการสร้างตัวกรองขึ้นมา (Filter) โดยตัวกรองมีหน้าที่แปลงข้อมูลขาเข้าหรือขาออกตามแต่หน้าที่ เพื่อทำอะไรบางอย่างก่อนจะปล่อยข้อมูลออกมา หรือใส่ข้อมูลเข้าไปใน Stream

Filter จะไม่เปลี่ยนแปลงตัว Raw Data แต่จะทำการแปลงให้อยู่ในรูปแบบที่ใช้งานได้ง่ายขึ้น เช่น
– BufferedInputStream ทำหน้าที่อ่าน Stream มาเยอะ ๆ แล้วเก็บเอาไว้ในหน่วยความจำ แต่เวลาใช้งานเราใช้งานเสมือนว่าข้อมูลยังส่งอยู่ในสายข้อมูล มีประโยชน์ในการ mark/reset เพื่อย้อนกลับไปยังจุดที่เคยอ่านมาก่อน ซึ่ง Stream จริงๆ ไม่ใช่แบบนั้น (สายน้ำย่อมไม่ไหลย้อนกลับ แต่กักตุนได้)