首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java序列化难题

Java序列化难题
EN

Stack Overflow用户
提问于 2012-12-17 18:49:13
回答 2查看 171关注 0票数 0

我在序列化方面有一些问题

下面是我将mClassifier对象写入文件的代码:

代码语言:javascript
复制
FileOutputStream fileOut = new FileOutputStream("C:\\polarity.model");
ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
mClassifier.compileTo(objOut);
objOut.close();

它工作得很好,并将内容写入文件。

但是有一个问题:myClassifier对象的类型是DynamicLMClassifier。然而,上面的compileTo方法返回LMClassifier (超类)的一个实例

下面是我读取对象的代码:

代码语言:javascript
复制
FileInputStream in = new FileInputStream("C:\\polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
mClassifier = (DynamicLMClassifier)(ois.readObject());
ois.close();

当我读取对象时,我将其类型转换为DynamicLMClassifier,它也工作得很好,但是我没有得到我想要的输出。再次读取对象时,不应将其类型转换为LMClassifier而不是DynamicLMClassifier。然而,如果我这样做了,编译器会抱怨它应该是DynamicLMClassifier类型。

以上可能是问题,还是我在其他地方做错了什么。我的意思是,没有序列化的代码工作得很好,我得到了想要的输出,我的意思是当对象在内存中的时候。

编辑:这里是完整的代码(只需删除train()getSentiments()方法中的序列化部分,它就能正常工作),还请注意,在(1)使用序列化时,我没有调用getSentiments(),我只是在训练,即调用train ()方法(2)现在我在(1)之后有了一个序列化的模型,我不是通过在main中注释出适当的代码来调用train()方法:

代码语言:javascript
复制
public class PolarityBasic{

    File mPolarityDir;
    String[] mCategories;
    DynamicLMClassifier<NGramProcessLM> mClassifier,readClassifier;

    PolarityBasic(String[] args) {
        System.out.println("\nBASIC POLARITY DEMO");
        mPolarityDir = new File("C:\\review_polarity","txt_sentoken");
        System.out.println("\nData Directory=" + mPolarityDir);
        mCategories = mPolarityDir.list();
        int nGram = 8;
        mClassifier 
            = DynamicLMClassifier
            .createNGramProcess(mCategories,nGram);
   }

    void run() throws ClassNotFoundException, IOException {
        train();
   }

    boolean isTrainingFile(File file) {
        return file.getName().charAt(2) != '9';  // test on fold 9
    }

    void train() throws IOException {
        int numTrainingCases = 0;
        int numTrainingChars = 0;
        System.out.println("\nTraining.");
        for (int i = 0; i < mCategories.length; ++i) {
            String category = mCategories[i];
            Classification classification
                = new Classification(category);
            File file = new File(mPolarityDir,mCategories[i]);
            File[] trainFiles = file.listFiles();
            for (int j = 0; j < trainFiles.length; ++j) {
                File trainFile = trainFiles[j];
                if (isTrainingFile(trainFile)) {
                    ++numTrainingCases;
                    String review = Files.readFromFile(trainFile,"ISO-8859-1");
                    numTrainingChars += review.length();
                    Classified<CharSequence> classified
                        = new Classified<CharSequence>(review,classification);
                    mClassifier.handle(classified);

                }
            }
        }
        FileOutputStream fileOut = new FileOutputStream("C:\\review_polarity/polarity.model");
        ObjectOutputStream objOut = new ObjectOutputStream(fileOut);
        mClassifier.compileTo(objOut);
        objOut.close();
        System.out.println("  # Training Cases=" + numTrainingCases);
        System.out.println("  # Training Chars=" + numTrainingChars);
    }


    String getSentiment(String text) {
        try{
            FileInputStream in = new FileInputStream("C:\\review_polarity/polarity.model");
            ObjectInputStream ois = new ObjectInputStream(in);
            mClassifier = (DynamicLMClassifier)(ois.readObject());
            ois.close();
        }
        catch(Exception e){}
        Classification classification = null;
        classification = readClassifier.classify(text);
        System.out.println("classification:  " + classification);
        return (classification.bestCategory());
    }

    public static void main(String[] args) {
        try {
            PolarityBasic pB = new PolarityBasic(args);
            pB.run();
            String text = null;
            text = "It was awesome !";
           System.out.println("The text \"" + text + "\" is "
         + pB.getSentiment(text));
        } catch (Throwable t) {
            System.out.println("Thrown: " + t);
            t.printStackTrace(System.out);
        }
    }

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-18 13:04:22

解决了这个问题。下面是读回对象的代码(而不是问题中给出的代码):

代码语言:javascript
复制
LMClassifier readClassifier;
FileInputStream in = new FileInputStream("C:\\polarity.model");
ObjectInputStream ois = new ObjectInputStream(in);
readClassifier = (LMClassifier)(ois.readObject());
ois.close();
票数 0
EN

Stack Overflow用户

发布于 2012-12-17 19:03:24

我不确定您的compileTo方法是做什么的,但我假设它使用Java Serialization API (例如,writeObject())将对象写入流。

我也不完全确定你的问题是什么。如果mClassifier是静态类型DynamicLMClassifier,这是LMClassifier的子类,那么很明显,您不能将LMClassifier类型的对象赋给它。因此,对LMClassifier的强制转换应该会产生一个编译器错误。

如果您只持久化DynamicLMClassifier的实例,那么您可以安全地将类型转换为该类。

那么,除了渴望之外,你没有得到的结果是什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13912658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档