A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈欢 中级黑马   /  2012-7-17 21:04  /  1787 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈欢 于 2012-7-20 00:41 编辑

在JAVA解序列化中,如何读取bk1的private变量,不太明白
public static void main(String[] args) throws IOException, ClassNotFoundException {
try{
Book bk=new Book(0010,"JAVA学习基础","张宇",45.80);
FileOutputStream fo=new FileOutputStream("book.dat");
ObjectOutputStream oo=new ObjectOutputStream(fo);
oo.writeObject(bk);
oo.close();
FileInputStream fi=new FileInputStream("book.dat");
ObjectInputStream oi=new ObjectInputStream(fi);
Book bk1=(Book)oi.readObject();
}
}
catch(IOException e){
System.out.println("I/O Exception");
}
} }
class Book implements Serializable {
private int m_id;
private String m_name;
private String m_author;
double m_price;
public Book(int id, String name, String author, double price) {
m_id = id;
m_name = name;
m_author = author;
m_price = price;
}
}

2 个回复

倒序浏览
重发一次
建议:把代码弄到代码块上!

你的意思是怎么在main中读取bk1中的private变量吧;
很抱歉不可以!其实非要那么做就用暴力反射,我想那也不是你的意愿!
为什么不可以呢?序列号可以说是为了让对象长久存储!多用在游戏编程,流行的云计算等技术基础!
序列化不会破坏java的规则!所以以前在main中不可以访问private变量;现在也不可以!
那么Book bk1=(Book)oi.readObject();就好比book bk1=new book();
利用bk1能做的和以前一样!
序列化的目的是是为了本地化存储对象,可能现在demo中不是太能体现价值。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
/*
你的意思是说要读取私有变量是不是?

private 变量只在本类中有效,其它类就无法
直接读取,如果要读取,可以定义一个public
函数,把private变量传进去。其它类访问public
函数就可以了。

还有一个方法是反射。
我举了两个例子一看就明白了。
*/

class Book
{
        //m_name只在本类中有效
        private String m_name = "张三";

        //定义一个public 方法
        public String getM_name() {
                return m_name;
        }

        public void setM_name(String m_name) {
                this.m_name = m_name;
        }

}

public class PrivateDemo
{
        public static void main(String[] args)        throws Exception
        {
                Book b1 = new Book();
                //调用public 方法,访问private 变量
                String m_name1 = b1.getM_name();
                System.out.println(m_name1);
               
               
                //还有一种方法,反射
                //Field得到类的成员变量
                Field fieldN = b1.getClass().getDeclaredField("m_name");
                //强制得到类的私有变量
                fieldN.setAccessible(true);
                System.out.println(fieldN.get(b1));
        }
}

打印出

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马