{"id":337,"date":"2009-09-25T08:37:13","date_gmt":"2009-09-25T00:37:13","guid":{"rendered":"http:\/\/www.andreanolanusse.com\/pt\/?p=337"},"modified":"2013-05-01T21:56:45","modified_gmt":"2013-05-02T04:56:45","slug":"datasnap-2010-enviando-e-recebendo-objetos","status":"publish","type":"post","link":"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/","title":{"rendered":"DataSnap 2010 \u2013 Enviando e recebendo objetos"},"content":{"rendered":"<p>Uma das perguntas frequentes dos usu\u00e1rios de Delphi 2009 e que utilizam DataSnap para cria\u00e7\u00e3o de objetos \u00e9 sobre a transfer\u00eancia de objetos entre cliente e servidor. No DataSnap 2009 estavamos limitados aos data types do dbxExpress, agora com o DataSnap 2010 que acompanha o Delphi 2010, isso \u00e9 totalmente poss\u00edvel.<\/p>\n<p>DataSnap 2010 traz o suporte a <strong><a href=\"http:\/\/www.json.org\/json-pt.html\">JSON<\/a><\/strong> (JavaScript Object Notation) que \u00e9 uma formata\u00e7\u00e3o leve de troca de dados, totalmente independente de linguagem, futuramente vou comentar mais sobre JSON e suas vantagens, para come\u00e7ar este post ir\u00e1 mostrar como transferir objetos entre cliente e servidores DataSnap, sendo que ambos cliente e servidor s\u00e3o aplica\u00e7\u00f5es Delphi.<\/p>\n<p>Para come\u00e7ar vamos definir uma classe chamada TCustomer.<\/p>\n<pre class=\"brush: delphi\">\r\nunit Customer;\r\n\r\ninterface\r\n\r\nuses\r\n   DBXJSON, DBXJSONReflect, SysUtils;\r\n\r\ntype\r\n   TMaritalStatus = (msMarried, msEngaged, msEligible);\r\n\r\nTCustomer = class\r\n    private\r\n       FName: string;\r\n       FAge: integer;\r\n       FMaritalStatus: TMaritalStatus;\r\n    public\r\n        property Name: string read FName write FName;\r\n        property Age: integer read FAge write FAge;\r\n        property MaritalStatus: TMaritalStatus read FMaritalStatus write FMaritalStatus;\r\n\r\n        function toString : string;override;\r\n  end;<\/pre>\n<p>Para transferir objetos em DataSnap estes devem descender the TJSONObject, no caso de n\u00e3o ser um objeto descendente voc\u00ea ter\u00e1 que utilizar as classes TJSONMarshal e TJSONUnMarshal para efetuar a transforma\u00e7\u00e3o dos objetos. Sendo assim os m\u00e9todos abaixo ir\u00e3o efetuar a convers\u00e3o dos mesmos.<\/p>\n<pre class=\"brush: delphi\">\r\nunit Customer;\r\n\r\n  function CustomerToJSON(customer: TCustomer): TJSONValue;\r\n  var\r\n    m: TJSONMarshal;\r\n  begin\r\n    if Assigned(customer) then\r\n    begin\r\n      m := TJSONMarshal.Create(TJSONConverter.Create);\r\n      try\r\n        exit(m.Marshal(customer))\r\n      finally\r\n        m.Free;\r\n      end;\r\n    end\r\n    else\r\n      exit(TJSONNull.Create);\r\n  end;\r\n\r\n  function JSONToCustomer(json: TJSONValue): TCustomer;\r\n  var\r\n     unm: TJSONUnMarshal;\r\n  begin\r\n    if json is TJSONNull then\r\n      exit(nil);\r\n    unm := TJSONUnMarshal.Create;\r\n    try\r\n      exit(unm.Unmarshal(json) as TCustomer)\r\n    finally\r\n      unm.Free;\r\n    end;\r\n  end;<\/pre>\n<p>Com isso temos classe TCustomer pronta para trafegar entre cliente e servidor, assim sendo basta implementar um Server Method que retorne um TJSONValue a partir da transforma\u00e7\u00e3o de TCustomer, como o exemplo abaixo.<\/p>\n<pre class=\"brush: delphi\">\r\n\/\/ protected\r\nfunction TServerMethods.GetCustomer: TCustomer;\r\nbegin\r\n  Result := TCustomer.Create;\r\n  Result.Name := 'Pedro';\r\n  Result.Age := 30;\r\n  Result.MaritalStatus := msEligible;\r\nend;\r\n\r\n\/\/ public\r\nfunction TServerMethods.GetJSONCustomer(): TJSONValue;\r\nvar\r\n  myCustomer: TCustomer;\r\nbegin\r\n  myCustomer := GetCustomer;\r\n  Result := CustomerToJSON(myCustomer);\r\n  myCustomer.Free;\r\nend;<\/pre>\n<p>No lado cliente ao executar o m\u00e9todo GetJSONCustomer ser\u00e1 necess\u00e1rio efetuar a transforma\u00e7\u00e3o de TJSONValue para TCustomer, utilizando o m\u00e9todo JSONToCustomer.<\/p>\n<pre class=\"brush: delphi\">\r\nvar\r\n  proxy: TServerMethodsClient;\r\n  myJSONCustomer: TCustomer;\r\nbegin\r\n\r\n  try\r\n    proxy := TServerMethodsClient.Create(SQLConnection1.DBXConnection);\r\n    myJSONCustomer := JSONToCustomer(proxy.myJSONCustomer);\r\n\r\n    Button1.Caption := myJSONCustomer.ToString;\r\n    myJSONCustomer.Free;\r\n  finally\r\n    SQLConnection1.CloneConnection;\r\n    proxy.Free;\r\n  end;\r\nend;<\/pre>\n<p>Muito mais pode ser feito, como retornar Arrays de objetos, classes mais complexas, etc. Estarei abordando estes temas em futuros posts.<\/p>\n<p>Download do <a href=\"http:\/\/cc.embarcadero.com\/Download.aspx?id=27361\">c\u00f3digo fonte<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Uma das perguntas frequentes dos usu\u00e1rios de Delphi 2009 e que utilizam DataSnap para cria\u00e7\u00e3o de objetos \u00e9 sobre a transfer\u00eancia de objetos entre cliente e servidor. No DataSnap 2009 estavamos limitados aos data types do dbxExpress, agora com o DataSnap 2010 que acompanha o Delphi 2010, isso \u00e9 totalmente poss\u00edvel. DataSnap 2010 traz o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4202,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_s2mail":"yes","footnotes":""},"categories":[102],"tags":[23,181,29],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v16.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Delphi 2010 - Enviando e Recebendo objetos com o DataSnap 2010<\/title>\n<meta name=\"description\" content=\"Uma das perguntas frequentes dos usu\u00e1rios de Delphi 2009 e que utilizam DataSnap para cria\u00e7\u00e3o de objetos \u00e9 sobre a transfer\u00eancia de objetos entre cliente\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Delphi 2010 - Enviando e Recebendo objetos com o DataSnap 2010\" \/>\n<meta property=\"og:description\" content=\"Uma das perguntas frequentes dos usu\u00e1rios de Delphi 2009 e que utilizam DataSnap para cria\u00e7\u00e3o de objetos \u00e9 sobre a transfer\u00eancia de objetos entre cliente\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/\" \/>\n<meta property=\"og:site_name\" content=\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\" \/>\n<meta property=\"article:published_time\" content=\"2009-09-25T00:37:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2013-05-02T04:56:45+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\" \/>\n\t<meta property=\"og:image:width\" content=\"170\" \/>\n\t<meta property=\"og:image:height\" content=\"170\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:site\" content=\"@andreanolanusse\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\">\n\t<meta name=\"twitter:data1\" content=\"2 minutos\">\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"Andreano Lanusse | Tecnologia e Desenvolvimento de Software\",\"description\":\"Andreano Lanusse blog - artigos, tutoriais e v&iacute;deos sobre tecnologia, desenvolvimento de software (Delphi XE4, C#, PHP, .NET) e t&eacute;cnicas de programa&ccedil;&atilde;o\",\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":\"http:\/\/www.andreanolanusse.com\/pt\/?s={search_term_string}\",\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#primaryimage\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"contentUrl\":\"http:\/\/www.andreanolanusse.com\/pt\/wp-content\/uploads\/2011\/09\/Icon_Delphi.png\",\"width\":170,\"height\":170},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#webpage\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/\",\"name\":\"Delphi 2010 - Enviando e Recebendo objetos com o DataSnap 2010\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#primaryimage\"},\"datePublished\":\"2009-09-25T00:37:13+00:00\",\"dateModified\":\"2013-05-02T04:56:45+00:00\",\"description\":\"Uma das perguntas frequentes dos usu\\u00e1rios de Delphi 2009 e que utilizam DataSnap para cria\\u00e7\\u00e3o de objetos \\u00e9 sobre a transfer\\u00eancia de objetos entre cliente\",\"breadcrumb\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"item\":{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"url\":\"http:\/\/www.andreanolanusse.com\/pt\/\",\"name\":\"In\\u00edcio\"}},{\"@type\":\"ListItem\",\"position\":2,\"item\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#webpage\"}}]},{\"@type\":\"Article\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#webpage\"},\"author\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"headline\":\"DataSnap 2010 \\u2013 Enviando e recebendo objetos\",\"datePublished\":\"2009-09-25T00:37:13+00:00\",\"dateModified\":\"2013-05-02T04:56:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#webpage\"},\"commentCount\":54,\"publisher\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\"},\"image\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#primaryimage\"},\"keywords\":[\"DataSnap\",\"Delphi\",\"JSON\"],\"articleSection\":[\"Delphi\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.andreanolanusse.com\/pt\/datasnap-2010-enviando-e-recebendo-objetos\/#respond\"]}]},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#\/schema\/person\/620bd05e81598c3aba4781796cbe8903\",\"name\":\"Andreano Lanusse\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\",\"inLanguage\":\"pt-BR\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/6a9c6f73c7c480fb826c7303288abfd3?s=96&d=mm&r=g\",\"caption\":\"Andreano Lanusse\"},\"logo\":{\"@id\":\"http:\/\/www.andreanolanusse.com\/pt\/#personlogo\"},\"sameAs\":[\"https:\/\/twitter.com\/andreanolanusse\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","_links":{"self":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/337"}],"collection":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/comments?post=337"}],"version-history":[{"count":0,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/posts\/337\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media\/4202"}],"wp:attachment":[{"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/media?parent=337"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/categories?post=337"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.andreanolanusse.com\/pt\/wp-json\/wp\/v2\/tags?post=337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}