Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


4 questions online user: 31

133
votes
answers
29 views
+10

Json <-> Java serialization that works with GWT [closed]

I am looking for a simple Json (de)serializer for Java that might work with GWT. I have googled a bit and found some solutions that either require annotate every member or define useless interfaces. Quite a boring. Why don't we have something really simple like

class MyBean {
    ...
}

new GoodSerializer().makeString(new MyBean());
new GoodSerializer().makeObject("{ ... }", MyBean.class)
up vote 55 down vote accepted favorite
沙发
+550
+50

查看GWT的重疊類型我認為這是迄今為止在GWT中使用JSON最簡單的方法。以下是鏈接文章中的修改代碼示例:

  public class Customer extends JavaScriptObject {public final native String getFirstName()/ *  -  {return this.first_name; }  -  * /; public final native void setFirstName(String value)/ *  -  {this.first_name = value; }  -  * /; public final native String getLastName()/ *  -  {return this.last_name; }  -  * /; public final native void setLastName(String value)/ *  -  {this.last_name = value; }  -  * /; }   

定義了覆蓋類型後,從JSON創建JavaScript對象並在Java中訪問其屬性很容易:

  public static final native Customer buildCustomer(String json)/ *  -  {return eval('('+ json +' )'); }  -  * /;   

如果您想再次使用該對象的JSON表示,可以將覆蓋類型包裝在JSONObject中:

  Customer customer = buildCustomer(“{”巴特','辛普森'}“); customer.setFirstName(“莉莎”); //顯示{“first_name”:“Lisa”,“last_name”:“Simpson”} Window.alert(new JSONObject(customer).toString());   public static final native Customer buildCustomer(String json)/ *  -  {return eval('('+ json +')'); }  -  * /;   

如果您想再次使用該對象的JSON表示,可以將覆蓋類型包裝在JSONObject中:

  Customer customer = buildCustomer(“{”巴特','辛普森'}“); customer.setFirstName(“莉莎”); //顯示{“first_name”:“Lisa”,“last_name”:“Simpson”} Window.alert(new JSONObject(customer).toString());   public static final native Customer buildCustomer(String json)/ *  -  {return eval('('+ json +')'); }  -  * /;   

如果您想再次使用該對象的JSON表示,可以將覆蓋類型包裝在JSONObject中:

  Customer customer = buildCustomer(“{”巴特','辛普森'}“); customer.setFirstName(“莉莎”); //顯示{“first_name”:“Lisa”,“last_name”:“Simpson”} Window.alert(new JSONObject(customer).toString());   
 客戶客戶= buildCustomer(“{'Bart','Simpson'}”); customer.setFirstName(“莉莎”); //顯示{“first_name”:“Lisa”,“last_name”:“Simpson”} Window.alert(new JSONObject(customer).toString());   
 客戶客戶= buildCustomer(“{'Bart','Simpson'}”); customer.setFirstName(“莉莎”); //顯示{“first_name”:“Lisa”,“last_name”:“Simpson”} Window.alert(new JSONObject(customer).toString());  
     
			
        

我相信最好的方法是註釋getter並在編譯時生成(de)序列化方法 - skrat 2009年12月4日11:36

為什麼不直接使用GWT的內置JSON庫?google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/或者當問這個問題時這還沒有?我將在下面添加並回答。 - Eric Nguyen 2010年7月17日4:59

@mooreds你可以。您可以讓您的GWT JSO實現一個接口,但它必須是唯一一個延遲此接口的類型,您必須使用@SingleJsoImpl註釋此接口。然後,您可以在服務器端重用該接口。 - Mark Renouf 2010年7月24日23:14

看起來不再需要註釋:groups.google.com/group/google-web-toolkit/browse_thread/thread/ - mooreds 2010年9月2日3:32

+380

要嘗試的另一件事是推出新的 AutoBean 框架與GWT 2.1。

您可以定義bean的接口和發布它們的工廠,GWT會為您生成實現。

  interface MyBean {String getFoo(); void setFoo(String foo); } interface MyBiggerBean {List&lt; MyBean&gt; getBeans(); void setBeans(List&lt; MyBean&gt; beans&gt ;;}接口Beanery擴展AutoBeanFactory {AutoBean&lt; MyBean&gt; makeBean(); AutoBean&lt; MyBiggerBean&gt; makeBigBean();} Beanery beanFactory = GWT.create(Beanery.class); void go(){ MyBean bean = beanFactory.makeBean()。as(); bean.setFoo(“Hello,beans” ); }   

AutoBeanCodex < / a>可用於將它們序列化為json。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) }

AutoBeanCodex < / a>可用於將它們序列化為json。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) }

AutoBeanCodex < / a>可用於將它們序列化為json。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) / code>

AutoBeanCodex 可用於將它們與json序列化。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) / code>

AutoBeanCodex 可用於將它們與json序列化。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class)

AutoBeanCodex 可用於序列化它們往返於json。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class)

AutoBeanCodex 可用於序列化它們往返於json。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) 可用於將它們與json序列化。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) 可用於將它們與json序列化。

  AutoBean&lt; MyBean&gt; autoBean = AutoBeanUtils.getAutoBean(bean); String asJson = AutoBeanCodex.encode(autoBean).getPayload(); AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));   

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class) AutoBean&LT;為myBean&GT; autoBeanCloneAB = AutoBeanCodex.decode(beanFactory,MyBean.class,asJson); MyBean autoBeanClone = autoBeanCloneAB.as(); assertTrue(AutoBeanUtils.deepEquals(autoBean,autoBeanClone));

他們也在服務器端工作 - 使用 AutoBeanFactoryMagic.create(Beanery.class)而不是 GWT.create(Beanery.class)

如果您在服務器端使用DTO並且想要重用接口,那麼AutoBean絕對是您的最佳選擇。謝謝你rjrjr,它救了我的命...(或至少幾個小時) - zdenda.online 12年11月11日在13:57

這需要在非gwt服務器上使用接口和pojos。是否有純粹的Jackson兼容pojo解決方案? - itaifrenkel 12年11月11日2:11

您可以在GWT客戶端中使用AutoBean,並使用您喜歡的框架創建JSON。它在網絡上是簡單的JSON。 - Christian Kuetbach 12年12月12日14:01

如果我能不止一次地投票,我願意。解決這個難題的絕佳解決方案。 - Spedge 2013年5月14日13:23

+120

最簡單的方法是使用GWT的內置JSON API。這是文檔這裡有一個關於如何使用它的精彩教程

這很簡單:

  String json = // json string JSONValue value = JSONParser.parse(json);   

JSONValue API非常酷。它允許您在從JSON對像中提取值時鏈接驗證,以便在格式錯誤的情況下拋出異常。

更不用說,效率更高。 - Mark Renouf 2010年7月24日23:15

+110

我似乎找到了正確答案的問題

我發現在GWT中將bean轉換為json和json轉換為bean不是一項簡單的任務。已知的庫不起作用,因為GWT需要完整的源代碼,並且此源代碼必須僅使用由GWT模擬的Java類。此外,您不能在GWT中使用反射。非常嚴格的要求!

我找到了唯一一個名為 gwt-jsonizer <的解決方案/ A>。它使用自定義的生成器類並且需要每個“jsonable”bean的衛星接口。不幸,如果沒有修補最新版本的GWT並且很長時間沒有更新它就無法工作。

所以,我個人認為讓我的豆子如何將自己轉換為更便宜和更快從json。像這樣:

  public class SmartBean {private String name; public String getName(){return name; public void setName(String value){name = value; public JSONObject toJson(){JSONObject result = new JSONObject(); result.put(“name”,new JSONString(this.name)); 返回結果; public void fromJson(JSONObject value){this.name = value.get(“name”)。isString()。stringValue();   

JSONxxxx

有趣。對我來說,這似乎與GWT有點短暫。但知道有辦法很好。我可能需要在將來自己做這件事,因為我們有一個使用GWT編寫的儀表板應用程序。 - StaxMan 09年3月31日18:10

是的,這就是為什麼他們最終開發了一個內置的GWT JSON解析器。google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/我還添加了一個更完整的答案。 - Eric Nguyen 2010年7月17日5:11

這應該被標記為答案,因為它是最乾淨的方式,並且不會在任何非核心GWT庫上中繼來完成。 - Jason Washo 2016年8月11日2:36

+60

RestyGWT 是一個功能強大的庫,用於在GWT中將Java Object編碼或解碼為JSON:

  import javax.ws.rs.POST; ...公共接口PizzaOrderCodec擴展了JsonEncoderDecoder&lt; PizzaOrder&gt; {}   

然後:

  // GWT將為您實現接口PizzaOrderCodec codec = GWT.create(PizzaOrderCodec.class); //將對象編碼為json PizzaOrder order = ... JSONValue json = codec.encode(order); //將對象解碼為json PizzaOrder other = codec.decode(json);   

它還有幾個易於使用的API來使用Restful Web服務。

祝你玩得愉快。

+50

檢查:

GWT Professional JSON Serializer: http:// code。 google.com/p/gwtprojsonserializer/

!與GWT 2.0 +配合使用!

在這一點上,最先進的技術是GWT的內置JSON解析器。google-web-toolkit.googlecode.com/svn/javadoc/2.0/com/google/我還添加了一個更完整的答案。 - Eric Nguyen 2010年7月17日5:11

問題是關於序列化,而不是解析... - Mark Renouf 2010年7月24日23:15

+30

json.org/java這些天似乎包含在GWT中:

gwt-servlet-deps.jarorgjson

或者,這個項目似乎很全面: http://code.google.com/p/piriti/

我想現在(截至本評論發布之日),Piriti和RestyGWT是兩個最佳解決方案。RestyGWT的侵入性比Piriti小得多,但Piriti看起來更強大。 - monkjack 2011年1月22日11:15

+20

在Google Web Toolkit Applications(第510至522頁)中,作者Ryan Dewsbury展示瞭如何使用GWT代碼生成與XML和JSON文檔進行序列化。

您可以在此處下載代碼; 你想要第10章代碼包,然後你想查看src / com / gwtapps / serialization包。我沒有看到此代碼的許可證,但已通過電子郵件發送給作者以查看他所說的內容。如果他回复,我會更新。

此解決方案的問題:

  • 您必須在要序列化的所有對像上添加標記接口(他使用java .io.Serializable但我想你可以使用其他人 - 如果你在你的後端使用hibernate,你的pojos可能已被標記為這樣)。
  • 代碼只支持字符串屬性; 它可以擴展。
  • 代碼只寫為1.4和1.5。

    所以,這不是一個開箱即用的解決方案,而是一個很好的起點有人建立一個適合GWT的JSON序列化程序。將它與服務器端的JSON序列化程序結合起來,如 json-lib ,你很高興go。

    我還找到了這個項目 (再次,需要一些標記界面。) li>代碼僅支持字符串屬性; 它可以擴展。

  • 代碼只寫為1.4和1.5。

    所以,這不是一個開箱即用的解決方案,而是一個很好的起點有人建立一個適合GWT的JSON序列化程序。將它與服務器端的JSON序列化程序結合起來,如 json-lib ,你很高興go。

    我還找到了這個項目 (再次,需要一些標記界面。) li>代碼僅支持字符串屬性; 它可以擴展。

  • 代碼只寫為1.4和1.5。

    所以,這不是一個開箱即用的解決方案,而是一個很好的起點有人建立一個適合GWT的JSON序列化程序。將它與服務器端的JSON序列化程序結合起來,如 json-lib ,你很高興go。

    我還找到了這個項目 (再次,需要一些標記界面。) 4和1.5。

    所以,這不是一個開箱即用的解決方案,但是有人建立一個適合GWT的JSON序列化器的一個很好的起點。將它與服務器端的JSON序列化程序結合起來,如 json-lib ,你很高興go。

    我還找到了這個項目 (再次,需要一些標記界面。) 4和1.5。

    所以,這不是一個開箱即用的解決方案,但是有人建立一個適合GWT的JSON序列化器的一個很好的起點。將它與服務器端的JSON序列化程序結合起來,如 json-lib ,你很高興go。

    我還找到了這個項目 (再次,需要一些標記界面。)

那麼你將如何使用if / else解析數百種不同的JSON變體? - TheVillageIdiot 12年12月24日1:54

@TheVillageIdiot:它們作為一個JSON對象轉儲到日誌中。所以這就是為什麼我只關心它們作為JSON對像或字符串 - 不關心它們內部的內容。 - DeepSpace101 12年12月24日凌晨2點07分

+10

從Google代碼中試用此序列化程序: http://code.google.com/p/ json-io /

如果您需要在Java中編寫或讀取JSON格式,則可以使用此工具。無需創建額外的類等。在一次調用中將Java對像圖轉換為JSON格式。相反 - 創建一個JSON String或Stream to Java對象。這是我見過的最快的庫。在大多數情況下,它比ObjectOutputStream和ObjectInputStream更快,它使用二進制格式。

非常方便的實用程序。

0

我似乎在回答這個問題很多...

code.google.com上有一個名為將GWT用於JSON Mashups (不幸的是)它超過了我的頭腦,因為我不熟悉GWT,所以它可能沒有用。

0

您可能想要查看此項目 https://gerrit.googlesource.com/gwtjsonrpc/

這是一個為了支持Android,Gerrit的代碼審查系統而創建的庫,但它是一個獨立的模塊,意味著嵌入到任何GWT項目中,而不僅僅是Gerrit。

合理的教程可能是 README 目錄的頂級。它與標準GWT RPC非常相似,但它使用JSON編碼。它還具有內置的XSRF保護功能。

@xjuice如果你正在使用Core,但是使用MVC 5,這將不起作用。 - AaronLS 5月8日16:25

-10

好的,我刪除了之前的答案,因為事實證明這正是你不想要的。

我不知道它對GWT的效果如何,但我們使用 json-lib 庫,用於序列化我工作的普通Java項目中的對象。

它可以直接從JavaBean創建JSONObject ,然後使用生成的JSONObject的toString( )方法來獲取實際的JSON字符串。

同樣,它也可以轉為 JSON回到JavaBean

依賴於Java反射的JSON marshallers將不能與GWT一起工作 - monkjack 2011年1月22日11:15

你可以將json字符串作為ActionResult的參數 - 如何?這是原始問題,因為我無法獲得jsonBody數據。即使我將jsonBody定義為字符串或對象,jsonBody == null! - DeepSpace101 12年12月24日6:00

-10

不確定 Jackson 是否適合您。我不知道你是否正在尋找具體的GWT; 如果沒有它應該工作。

但它的序列化/反序列化工作得很好,如:

  //讀取json,創建對象ObjectMapper mapper = new ObjectMapper(); MyBean bean = mapper.readValue(jsonAsString,MyBean.class); //並寫出StringWriter sw = new StringWriter(); mapper.writeValue(sw,user); String jsonOut = sw.toString();   

您確實需要訪問器( getX()來序列化, setX()來反序列化;可以用其他名稱註釋方法),但就是這樣。

Jackson是一個很棒的工具,但它不能被GWT交叉編譯成JavaScript,因為對象映射器可能會大量使用反射 - 這是GWT領域不支持的Java特性。 - ShabbyDoo 2010年9月24日2:31

啊。是的,有道理,感謝指出(給出js-to-java轉換) - StaxMan 2010年9月24日4:59

gwt-jackson“是基於Jackson註釋的GWT JSON序列化器/解串器機制” - snorbi 14年9月9日在7:59

0
votes
answers
62 views
+10

Marshal.SizeOf()無法計算包含字符串的對象的大小

0

Marshal.SizeOf()將在嘗試計算MyClass類型的對象的長度時引發異常。Marshal.SizeOf()無法計算包含字符串的對象的大小

這裏是類:

<StructLayout(LayoutKind.Sequential, Pack:=1)> 
Public Class MyClass 

    Public ReadOnly UniqueId As Long 

    <MarshalAs(UnmanagedType.AnsiBStr, SizeConst:=60, SizeParamIndex:=0)> 
    Public ReadOnly Name As String 

End Class 

該代碼將失敗:

Dim MyObject = New MyClass() 
Dim size = Marshal.SizeOf(MyObject) 'will throw exception here. Why? 

它會拋出異常「任何有意義的大小或偏移量可以計算」

我怎樣才能取而代之的是MyObject的長度?

+0

什麼平臺你正在使用 – Adrian

+0

這個問題似乎與'AnsiBStr'。 'BStr' /'LPStr' /'LPWStr'似乎很好https://stackoverflow.com/questions/64714??21/marshal-c-char-in-c-sharp – Slai

+0

我正在編譯到x64 Windows中的AnyCPU。 –

沙发
0
0

我相信UnmanagedType.AnsiBStr只能用於方法簽名的參數(傳遞值)。

對BSTR的引用是指向長度前綴字符數組的指針。因此,它將是一個.Net Intptr,其大小爲4或8個字節,具體取決於進程位(x32或x64)。如果您需要ANSI字符,可以定義爲StructLayout聲明的一部分並標記字符串作爲UnmanagedType.BStr

<StructLayout(LayoutKind.Sequential, Pack:=1, CharSet:=CharSet.Ansi)> 
Public Class [MyClass] 
    Public ReadOnly UniqueId As Long 
    <MarshalAs(UnmanagedType.BStr)> 
    Public ReadOnly Name As String 
End Class 

推薦閱讀:

板凳
0
-1

即時通訊設法幫助。馬歇爾用於值類型例如:結構類別引用類型這是不需要計算內部未使用的對象。你需要使用ex:struct來完成它的工作。我給我的代碼的例子,但對不起,我寫在C#

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestingData p = new TestingData(); 
     Console.WriteLine("Number of bytes : {0}", Marshal.SizeOf(p)); 
    } 
} 

public struct TestingData 
{ 
    public string a; 
} 

希望它的幫助。欲瞭解更多信息,你可以去這裏Marshal Documentation

0
votes
answers
33 views
+10

C#元帥空值終止字符串數組

0

我試圖導入以下:C#元帥空值終止字符串數組

const char * const *object_get_prop_names(propobject_t *ocr); 

爲:

[DllImport("vender.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] 
private static extern IntPtr object_get_prop_names(int* osr); 

基於:https://limbioliong.wordpress.com/2011/08/14/returning-an-array-of-strings-from-c-to-c-part-1/

我已經試過如下:

var pNames = object_get_prop_names(hdl); 

int StringCount = 200; //how do I know string count? 

IntPtr[] pIntPtrArray = new IntPtr[StringCount]; 
ManagedStringArray = new string[StringCount]; 

Marshal.Copy(pNames, pIntPtrArray, 0, StringCount); 

for (int i = 0; i < StringCount; i++) 
{ 
    ManagedStringArray[i] = Marshal.PtrToStringAnsi(pIntPtrArray[i]); 
    //Marshal.FreeCoTaskMem(pIntPtrArray[i]); crashes 
} 

//Marshal.FreeCoTaskMem(pUnmanagedStringArray); crashes 

這個工程,但我猜我有內存泄漏和訪問內存我不應該。

我該如何釋放內存?

我如何知道計數?這是來自一個供應商,他們不會修改這個dll對我來說很小。 :)

還原諒我鑽研我知道很少的東西。

+1

它返回const char *,所以沒有太多理由擔心釋放字符串。必須有一些*種方法來找出有多少字符串。我會尋找IntPtr.Zero或一個空字符串。您不能安全地使用Marshal.Copy(),直到您知道爲每個元素使用Marshal.ReadIntPtr(),每次通過IntPtr.Size遞增pName。 –

+0

@Hans工作!我閱讀,直到我得到一個空。你能寫出解決方案,以便我可以給你信用? – ginalster

沙发
0
1

繼漢斯的建議:

var pNames = object_get_prop_names(hdl); 
if (h == IntPtr.Zero) 
{ 
    return null; 
} 

var nameList = new List<string>(); 
int elementSize = Marshal.SizeOf(typeof(IntPtr)); 

for (int i = 0; i < 200; i++) //don't know length, pick large number 
{ 
    var ptr = Marshal.ReadIntPtr(pNames, i * elementSize); 
    var str = Marshal.PtrToStringAnsi(ptr); 
    if (!string.IsNullOrWhiteSpace(str)) 
    { 
     nameList.Add(str); 
    } 
    else //end of pNames 
    { 
     break; 
    } 
} 

的偉大工程。我無法知道有多少個房產名稱,所以我只需要選擇比可能的房產名稱數量更多的房產。

0
votes
answers
26 views
+10

Lowercase JSON key names with JSON Marshal in Go

I wish to use the "encoding/json" package to marshal a struct declared in one of the imported packages of my application.

Eg.:

type T struct {
    Foo int
}

Because it is imported, all available (exported) fields in the struct begins with an upper case letter. But I wish to have lower case key names:

out, err := json.Marshal(&T{Foo: 42})

will result in

{"Foo":42}

but I wish to get

{"foo":42}

Is it possible to get around the problem in some easy way?