2009-10-01 185 views
0

來自以下鏈接。與iPhone通信 - 互聯網 - .net Web服務/ php網絡服務


iPhone interaction with ASP.NET WebService


@Pravara - 當被問及在回答一個問題。

問題是這樣的。


大家好,

是XML僅僅是.NET Web服務和iPhone之間的溝通方式?我已經在我的應用程序中實現了它,但由於掃描每個XML標籤需要時間,因此我面臨性能問題。

任何人都可以建議任何溝通方式,而不是發送XML作爲迴應。

Thanx提前。 :-)


我想知道這一點。

在此先感謝您與我們分享您的知識。

薩加爾

(我知道Web服務是指本身XML,但我發現它非常典型的,像傳輸整個數據庫的XML在創建Web服務&再由iPhone解析它 - 就像是費力的工作)

回答

2

JSON是一個更好的通信協議,因爲它在我看來體積小,易於集成。你會想要退房JSON.framework,TouchJSONObjectiveResource

+0

更好的是,當然是主觀的。 JSON出於你指定的原因是很棒的,但如果你有深層次結構的數據,那麼使用它非常痛苦。在這種情況下,與使用XPath查詢XML文檔相比,在字典內的字典中級聯字典等容易得多。...使用您已鏈接的庫之一轉換JSON字符串時得到的類型結構。我都爲JSON和圖書館,但有時XML實際上是「更好」。 – 2009-10-01 17:12:14

+0

不好說,一切都有好處和缺點 – slf 2009-10-02 01:31:56

2

Hessian是一個比JSON更好的通信協議。作爲一種二進制格式,它更加緊湊,並且嚴格格式解析速度更快。

作爲獎勵,已經有Java,.NET和PHP公開Web服務的框架。真的很容易。 Asume你有這樣的C#接口:

public interface ITest { 
    public string getGreeting(); 
    int addNumbers(int a, int b); 
} 

然後實現它使用HessianC#在服務器上是一個單元:

public class CTest:CHessianHandler, ITest { 
    public string getGreeting() { return "Hello World!"; } 
    public int addNumbers(int a, int b) { return a + b; } 
    [STAThread] 
    private static void Main(string[] args) { 
    CWebServer web = new CWebServer(5667, "/test/test.hessian", typeof (CTest)); 
    web.Paranoid = true; 
    web.AcceptClient("[\\d\\s]"); 
    web.Run(); 
    for (;;) { 
     if (Console.ReadLine() != "") { 
     web.Stop(); 
     break; 
     } 
    } 
    } 
} 

在iPhone上側的C#接口需要被翻譯成Objective-C的協議:

@protocol ITest 
-(NSString*)getGreeting; 
-(int)addNumbers:(int)a :(int)b; 
@end 

,然後使用HessianKit用於獲取代理的服務幾乎是一樣容易:

id<ITest> proxy = [CWHessianConnection proxyWithURL:serviceURL 
              protocol:@protocol(ITest)]; 
NSLog(@"Greeting: %@", [proxy getGreeting]); 
NSLog(@"The answer: %d", [proxy addNumbers:40 :2]); 

在這個簡短的回答中,方法名稱並不完全是C#-ish,也不完全是Obj-C-ish。這是因爲默認情況下HessianKit使用Java的命名約定。這可以通過提供方法和類型名稱轉換在HessianKit中重寫。因此,連接上的C#和Obj-C端在家中感覺都是100%。例如:

[CWHessianArchiver setClassName:@"com.mycompany.ITest" 
        forProtocol:@protocol(CWTest)]; 
[CWHessianArchiver setMethodName:@"AddNumbers" 
        forSelector:@selector(addInt:toInt:)];