Serialization j2objc对象序列化--java.lang.NoSuchMethodException:writeReplace

Serialization j2objc对象序列化--java.lang.NoSuchMethodException:writeReplace,serialization,j2objc,Serialization,J2objc,更新-您可以在此处找到一个示例项目来重新创建问题: 我试图用Java序列化一个对象,并将字节传递给我的Objective-C层以写入文件系统。我的相关Java代码如下: /** * Created by benjamin.flynn on 10/7/15. */ public class TestData implements Serializable { private String mName; private int mAge; public TestDat

更新-您可以在此处找到一个示例项目来重新创建问题:

我试图用Java序列化一个对象,并将字节传递给我的Objective-C层以写入文件系统。我的相关Java代码如下:

/**
 * Created by benjamin.flynn on 10/7/15.
 */
public class TestData implements Serializable {

    private String mName;
    private int mAge;

    public TestData(String pName, int pAge) {
        mName = pName;
        mAge = pAge;
    }

    public String getName() {
        return mName;
    }

    public int getAge() {
        return mAge;
    }

    public byte[] bytes() {
        byte[] bytes = null;
        try (ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
             ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);) { // Application will break on this line when run on Xcode
            objectOutputStream.writeObject(this);
            bytes = byteOutputStream.toByteArray();
        } catch (IOException ioe) {
            System.err.println("Aww snap: " + ioe);
        }
        return bytes;
    }

}
我已经用Java对这个类进行了单元测试,我还为它提供了一个反序列化程序,它通过了测试。在Objective-C中,我这样做:

ComMycompanyTestData *testData = [[ComMycompanyTestData alloc] initWithNSString:@"Daryl" withInt:47];
IOSByteArray *bytes = testData.bytes; // Exception here
例外情况是:

(lldb) po $arg1
java.lang.NoSuchMethodException: writeReplace
有关的追踪是:

frame #0: 0x000000019a2cbf48 libobjc.A.dylib`objc_exception_throw
    frame #1: 0x0000000100214bb0 MyApp `-[IOSClass getDeclaredMethod:parameterTypes:] + 124
    frame #2: 0x00000001000c9188 MyApp`JavaIoObjectStreamClass_findMethodWithIOSClass_withNSString_ + 144
    frame #3: 0x00000001000c71dc MyApp`JavaIoObjectStreamClass_createClassDescWithIOSClass_ + 984
    frame #4: 0x00000001000c909c MyApp`JavaIoObjectStreamClass_lookupStreamClassWithIOSClass_ + 88
    frame #5: 0x00000001000c8f88 MyApp`JavaIoObjectStreamClass_lookupWithIOSClass_ + 44
    frame #6: 0x00000001000c6f30 MyApp`JavaIoObjectStreamClass_createClassDescWithIOSClass_ + 300
    frame #7: 0x00000001000c909c MyApp`JavaIoObjectStreamClass_lookupStreamClassWithIOSClass_ + 88
    frame #8: 0x00000001000c8f88 MyApp`JavaIoObjectStreamClass_lookupWithIOSClass_ + 44
    frame #9: 0x00000001000c284c MyApp`JavaIoObjectOutputStream_initWithJavaIoOutputStream_ + 56
    frame #10: 0x00000001000c6a20 MyApp`new_JavaIoObjectOutputStream_initWithJavaIoOutputStream_ + 48
  * frame #11: 0x00000001000a666c MyApp`-[ComMycompanyTestData bytes](self=0x000000013fd51a50, _cmd="bytes") + 76 at TestData.java:49

关于可能发生的事情的想法?

您正在使用哪个版本的j2objc?我们最近对序列化进行了改进,在添加以下测试后运行您的示例:

公共静态无效字符串[]args{ TestData td=新的TestDataJane Doe,30; 字节[]序列化=td.bytes; System.out.printlnserialized:+Arrays.ToString序列化; }

我在当前j2objc源代码上使用make dist构建了一个转换器/运行时来运行此操作:

$javactestdata.java $java测试数据 序列化:[-84,-19,0。。。 $j2objc TestData.java 翻译TestData.java 已翻译的1个文件:0个错误,0个警告 $j2objcc TestData.m $./a.out测试数据 序列化:[-84,-19,0。。。

我将尝试一下,谢谢。我使用的是j2objc 0.9.8.2.1.Hmm。这是从命令行运行的。当我在iOS设备上运行时,它不起作用。我将深入研究一下我的项目文件。仅供参考,我使用的是Xcode 7.0.1,iOS SDK 9.0,我的构建中包含了libjre_emul.a。我能够将字符串从Java传递到Objective-C,但使用了这个方法我遇到了一点麻烦。我现在也尝试从GitLab编译最新的源代码,使用将JreEmulation作为子项目的说明,但我看到了相同的错误。我在GitHub上创建了一个项目,演示了我看到的行为。请看我的更新问题。我想我找到了:您是否设置了所有异常的中断在调试器中?如果是,则此异常不是失败-它是正常的Java行为。ObjectStreamClass.findMethod通过调用class.getDeclaredMethod并捕获任何NoSuchMethodExceptions来检查类层次结构中的每个类是否有writeReplace方法。因此,请删除所有异常断点-您可以改为在特定异常上中断当你需要的时候。