使用语言

时间:2017-03-13 11:06:09

标签: java c# android serialization

以下C#代码允许在一个程序中创建对象,将其序列化并将其发送到端点。接收方可以反序列化数据并调用其中一个对象方法。

[Serializable]
public class MyClass
{
    private int myInt;
    private string myString;

    public MyClass(int i, string s) ...
    public virtual void SayHello()
    {
        // Do something
    }
}

发信人:

MyClass myClass = new MyClass(1, "a");
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(someOutputStream, myClass);

接收器:

IFormatter formatter = new BinaryFormatter();
MyClass myClass = formatter.Deserialize(someInputStream) as MyClass;
myClass?.SayHello();

如果双方具有相同的具有MyClass decleration的dll,则可以使用此功能。

我的问题是:当涉及到C#服务器和Java客户端(android)之间的通信时,这个功能是否可行?

我已阅读有关Google ProtoBuf功能的信息,该功能仅允许数据序列化,但不支持方法声明。

最终目的是在服务器端创建一个对象并运行它的方法 在客户端。

2 个答案:

答案 0 :(得分:0)

如果您想调用另一种语言编写的函数,可以考虑使用swig。

如果您想将自定义函数传递给另一种计算机,另一种语言,您可能应该在两台计算机上使用相同的语言编写包装器。

答案 1 :(得分:0)

部分答案如下......

异构系统之间传输数据的很大一部分是确保1)数据含义完整,2)数据约束得到尊重。虽然许多序列化技术满足1),但没有多少满足2)。示例是XSD / XML和ASN.1。 JSON模式也可以表达约束,我对工具是否能够很好地实现它们有点不确定。

“约束”是指对数字或文本数量的值,数组大小等的限制。想象一下,如果消息中的字段被称为“方位”,则将其约束为0-> 359可能是有意义的。因此,如果一个程序已发送360,则接收方自动拒绝该消息为超出规范。一个体面的序列化技术不会让你首先发送360,在序列化过程中引发错误。

我之所以提到这一点,只是因为1)它是可以实现的,并且2)它在你想要做的事情中消除了很大一部分苦差事。是的,您仍然需要在Android上重新实现Java中的方法,但至少您不必检查已反序列化的内容是否有效。那会节省你一些时间。

另一种可能性是代码生成。像Enterprise Architect这样的工具(至少与系统工程版一起使用)允许您使用UML定义状态机,然后使用您选择的语言从中生成功能代码。因此,企业架构师设计模型可能是您的“单点事实”,由此生成C#和Java实现。这可能是很多设置,熟悉等等,但可以使它工作。这些工具的更昂贵的版本(Artisan Designer?)做了更全面的工作,但是这非常昂贵...... Enterprise Architect相当便宜,几百美元,ish。