কেন WritObject java.io.NotSerializableException নিক্ষেপ করে এবং আমি কীভাবে এটি ঠিক করব?


110

আমার এই ব্যতিক্রম আছে এবং আমি বুঝতে পারি না কেন এটি নিক্ষেপ করা হবে বা কীভাবে আমি এটি পরিচালনা করব।

try {
    os.writeObject(element);
} catch (IOException e) {
    e.printStackTrace();
}

কোথায় elementএকটি হয় TransformGroupকিছু অন্যান্য ধারণকারী TransformGroupsবর্গ অ্যাটম একটি দৃষ্টান্ত:

public class Atom extends Group implements Serializable{
    float pozX,pozY;
    Group group= new Group();   
    Color3f blue = new Color3f(new Color(255));
    Color3f black = new Color3f(new Color(0));
    Sphere AtSph=new Sphere();

    public Atom(final float WEIGHT, final int BOUNDS,final float radius,Color3f color)
    {
        AppSetting ap= new AppSetting(color, black);
        AtSph=new Sphere(radius,1,100,ap);
    }
}

সম্পূর্ণ ত্রুটি লগ:

java.io.NotSerializableException: javax.media.j3d.TransformGroup
    at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    at java.io.ObjectOutputStream.writeObject(Unknown Source)
    at cls.MolecularBuilder.addAtom(MolecularBuilder.java:511)
    at cls.MolecularBuilder$Console.HidrogenItemActionPerformed(MolecularBuilder.java:897)
    at cls.MolecularBuilder$Console$2.actionPerformed(MolecularBuilder.java:746)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.AbstractButton.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
    at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$200(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

AppSetting (পরমাণু শ্রেণিতে) কেবলমাত্র একটি কাস্টম শ্রেণি যা উপস্থিতি প্রসারিত করে।


4
দেখে মনে হচ্ছে javax.media.j3d.TransformGroupনিজেই সিরিয়ালিজেবল প্রয়োগ করে না
মিচা

কেন Atomউভয়ই বাড়ে Groupএবং একটি Groupসদস্য আছে?
মারকুইস লর্ন

উত্তর:


210

আপনার অবজেক্টের ক্ষেত্রগুলি তাদের ক্ষেত্রগুলি ঘুরিয়ে দেবে, যার কয়েকটি বাস্তবায়ন করে না Serializable। আপনার ক্ষেত্রে আপত্তিকর শ্রেণিটি TransformGroup। কীভাবে সমাধান করবেন?

  • যদি ক্লাসটি আপনার হয়, এটি তৈরি করুন Serializable
  • ক্লাসটি যদি তৃতীয় পক্ষের হয় তবে আপনার ক্রমিক আকারে এটির দরকার নেই, ক্ষেত্রটি হিসাবে চিহ্নিত করুন transient
  • আপনি তার তথ্য এবং এটা তৃতীয় পক্ষের প্রয়োজন হলে, ধারাবাহিকতাতে অন্যান্য উপায়ে বিবেচনা তাদেরকে JSON, এক্সএমএল, BSON মত MessagePack , ইত্যাদি যেখানে আপনি 3rd পার্টি পেতে পারেন তাদের সংজ্ঞা পরিবর্তন ছাড়া ধারাবাহিকভাবে অবজেক্ট।

2
হ্যাঁ, অনেক ধন্যবাদ, এটি করা বেশ কঠিন কাজ হবে, যেহেতু আমার অবজেক্টগুলি কেবল ট্রান্সফর্মগ্রুপের অংশ হিসাবে উপস্থিত রয়েছে এবং এগুলি সংরক্ষণ করে এমন কোনও ভেরিয়েবল নেই। আমার অ্যাপ্লিকেশনটি 3 ডি অণু নির্মাতা এবং আমার সমস্ত পরমাণু এবং সীমানা স্রেফ উদাহরণস্বরূপ ট্রান্সফর্মগ্রুপে যুক্ত হয়েছে - যেমন (নতুন এটিম ())। সমস্যাটি কেবল তা নয় যে আমি তাদের একটি ফাইলে লিখিত প্রয়োজন, তবে ব্যবহারকারী বর্তমান অবজেক্টগুলি সরিয়ে বা সম্পাদনা করতে চাইতে পারে। আমি মনে করি আমি এক্সএমএল-ভিত্তিক কিছু সিরিয়ালাইজেশন চেষ্টা করব, তবে আমি ধারণায় বেশ নতুন এবং এটি আমার পক্ষে এখনও কিছুটা শক্ত। আপনাকে ধন্যবাদ
মিহাই বুজানকা

15
এই দুর্দান্ত উত্তরে যুক্ত করতে: আপনার যদি এটির ডেটা প্রয়োজন হয় এবং এটি তৃতীয় পক্ষের হয় তবে আপনি তৃতীয় পক্ষের শ্রেণিকে নিজের শ্রেণিতে গুটিয়ে রাখতে চাইতে পারেন, যা প্রয়োগ করে Serializableএবং ব্যবহার করে readObject()এবং writeObject()তৃতীয় পক্ষের শ্রেণীর ডেটা ম্যানুয়ালি সিরিয়াল করতে পারে। কিছু ক্ষেত্রে এটি একটি যুক্তিসঙ্গত পদ্ধতির হতে পারে। stackoverflow.com/a/12963580/1208581
sulai

76

java.io.NotSerializableExceptionআপনি যখন অভ্যন্তরীণ শ্রেণীর উদাহরণটি সিরিয়াল করুন তখন ঘটতে পারে কারণ:

এই জাতীয় অভ্যন্তরীণ উদাহরণটি সিরিয়ালকরণ করার ফলে এর সাথে সম্পর্কিত বহিরাগত শ্রেণীর উদাহরণটি সিরিয়ালাইজেশনের ফলে ঘটবে

স্থানীয় এবং বেনাম শ্রেণিসমৃদ্ধ অভ্যন্তরীণ শ্রেণিগুলির (যেমন, নেস্ট ক্লাস যা স্থির সদস্য শ্রেণি নয়) এর সিরিয়ালাইজেশন কঠোরভাবে নিরুৎসাহিত করা হয়েছে

তথ্যসূত্র: সিরিয়ালাইজযোগ্য ইন্টারফেস


5
এটা আমার ক্ষেত্রে ছিল। আমি যখন ইউনিট পরীক্ষায় শর্ট কাট নিয়েছিলাম তখন এটি ঘটছিল। আশা করি এই উত্তরটি অন্য কাউকে কিছুটা সময় সাশ্রয় করবে।
ব্যবহারকারী 489041

আমার কাছে একটি ফিল্ড বেসরকারী ফাইনাল সেট ছিল <ক্লেমসনোড> আউটগোয়িং = নতুন ট্রিসেট <ক্লেমস নোড> (নতুন তুলনাকারী <ক্লেমস নোড> () {পাবলিক ইনট তুলনা (দাবী নোড ও 1, ক্লেমস নোড o2) {রিটার্ন o1.getNativeIndex () - o2.getNativeIndex (); }});
ভাইটালি সাজনোভিচ

1
আশ্চর্যজনক, আক্ষরিক অর্থে আমি এইটিতে গত ১ ঘন্টা ছিলাম। আমি সন্দেহ শুরু করেছিলাম যে এমনকি আদিম কৌতুকগুলি সিরিয়ালযোগ্য নয় এবং তারপরে এটি আমার কাছে ঘটেছিল, সম্ভবত এখানে কিছু ভুল আছে।
শিবাম পোখরিয়াল

13

ইন্টারফেস প্রয়োগ করে শ্রেণি সিরিয়ালযোগ্য করে তুলুন java.io.Serializable

  • java.io.Serializable - চিহ্নিতকারী ইন্টারফেস যার কোনও পদ্ধতি নেই।
  • চিহ্নিতকারী ইন্টারফেসের উদ্দেশ্য - ObjectOutputStreamএই বস্তুটি সিরিয়ালাইজযোগ্য অবজেক্টটি তা বলার জন্য ।

7
আপনি প্রশ্নটি পড়তে পারেন, এটি ইতিমধ্যে সিরিয়ালাইজেবল কার্যকর করছে। এখনও 12+ আমাকে অবাক করে দিন।
শাইলু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.