محمد صادق شیخ زاهدی
محمد صادق شیخ زاهدی
خواندن ۲ دقیقه·۷ ماه پیش

اینترفیس Externalizable در جاوا

هدف اصلی این اینترفیس تسهیل سریال سازی و سریال سازی سفارشی است که با استفاده از آن می توان کنترل بیشتری بر سریالیزه سازی اشیا داشت به عنوان مثال می توان تعیین کرد کدام فیلد ها باید سریالیزه شوند یا نشوند، چک کردن validation یا پیاده سازی بیزینس های خود.

اینترفیس Externalizable در پکیج java.io.Externalizable است که از java.io.Serializable ارث بری میکند و باید تو تابع writeExternal()و readExternal() راباید override کرد.

public interface Externalizable extends java.io.Serializable { void writeExternal(ObjectOutput out) throws IOException; void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; }

خب بیایید یک مثال بزنیم :)

public class Country implements Externalizable { private String name; private int code; private int total; // getters, setters @Override public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(name); out.writeInt(code); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.name = in.readUTF(); this.code = in.readInt(); } }

در اینجا، ما یک کلاس Country تعریف کرده ایم که رابط Externalizable را پیاده سازی می کند و دو متد ذکر شده در بالا را پیاده سازی می کند.

در متد ()writeExternal برای serialized شی، ما ویژگی های شی را به جریان ObjectOutput اضافه می کنیم. که دارای متدهای استانداردی مانند writeUTF() برای String و writeInt() برای مقادیر int است.

در مرحله بعد در متد ()readExternal، برای deserialized شی، از جریان ObjectInput با استفاده از متدهای readUTF()، readInt() می خوانیم تا مقادیر را به همان ترتیبی که نوشته شده اند بخوانیم.

در مثال بالا ما فیلد total را در عملیات serialized و deserialized شرکت نداده ایم و فقط مقادیر name و code در این عملیات تبدیل و انتقال داده می شوند.


ما میتوانیم درون متدهای writeExternal و readExternal به راحتی و با کنترل کامل بیزینس های خود را پیاده سازی کنیم. برای مثال میتوانیم ولیدیشن های خود را بنویسیم

@Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { System.out.println(&quotCustom externalizable serialization logic invoked.&quot); this.name = in.readUTF(); this.code = in.readInt(); if (this.code == 840) { throw new IllegalArgumentException(&quotNot a valid country!&quot); } if (this.name.length()>150) { throw new IllegalArgumentException(&quotCountry name must be less than 150 characters!&quot); } }

در مثال بالا ما برای کشور با کد 840 و همچنین اسم کشور را به 150 کارکتر محدودیت ایجاد کردیم که در عملیات deserialized خطا ایجاد می کنیم.

بیایید یک فیلد جدید به کلاس Country برای یک سری اطلاعات امنیتی اضافه میکنیم

... private String superSecretInformation; ...

حال در فرایند serialized و deserialized ما این فیلد را اینکد و دیکد می کنیم

@Override public void writeExternal(ObjectOutput out) throws IOException { out.writeUTF(name); out.writeInt(code); out.writeUTF(Base64.getEncoder().encodeToString(superSecretInformation.getBytes())); } @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.name = in.readUTF(); this.code = in.readInt(); this.superSecretInformation = new String(Base64.getDecoder().decode(in.readUTF())); }
شاید از این پست‌ها خوشتان بیاید