From 3d37fba2063f87accb8cc22b5c78d00d85ecc49e Mon Sep 17 00:00:00 2001 From: Roger Meier Date: Wed, 19 Sep 2012 19:30:36 +0000 Subject: [PATCH] THRIFT-1694 Re-Enable serialization for WP7 Silverlight Patch: Jens Geyer git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1387715 13f79535-47bb-0310-9956-ffa450edef68 --- .../cpp/src/generate/t_csharp_generator.cc | 25 +++++++++++++------ lib/csharp/src/Collections/THashSet.cs | 19 ++++++++++++-- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc index 02db2c1d..d57e5348 100644 --- a/compiler/cpp/src/generate/t_csharp_generator.cc +++ b/compiler/cpp/src/generate/t_csharp_generator.cc @@ -50,6 +50,12 @@ class t_csharp_generator : public t_oop_generator iter = parsed_options.find("async"); async_ctp_ = (iter != parsed_options.end()); + iter = parsed_options.find("serial"); + serialize_ = (iter != parsed_options.end()); + if (serialize_) { + wcf_namespace_ = iter->second; // since there can be only one namespace + } + iter = parsed_options.find("wcf"); wcf_ = (iter != parsed_options.end()); if (wcf_) { @@ -142,6 +148,7 @@ class t_csharp_generator : public t_oop_generator std::ofstream f_service_; std::string namespace_dir_; bool async_ctp_; + bool serialize_; bool wcf_; std::string wcf_namespace_; }; @@ -192,7 +199,7 @@ string t_csharp_generator::csharp_type_usings() { (async_ctp_ ? "using System.Threading.Tasks;\n" : "") + "using Thrift;\n" + "using Thrift.Collections;\n" + - (wcf_ ? "using System.ServiceModel;\n" : "") + + (wcf_ ? "//using System.ServiceModel;\n" : "") + "using System.Runtime.Serialization;\n"; } @@ -444,10 +451,10 @@ void t_csharp_generator::generate_csharp_struct_definition(ofstream &out, t_stru indent(out) << "#if !SILVERLIGHT" << endl; indent(out) << "[Serializable]" << endl; - if (wcf_ &&!is_exception) { + indent(out) << "#endif" << endl; + if ((serialize_||wcf_) &&!is_exception) { indent(out) << "[DataContract(Namespace=\"" << wcf_namespace_ << "\")]" << endl; // do not make exception classes directly WCF serializable, we provide a seperate "fault" for that } - indent(out) << "#endif" << endl; bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end()); indent(out) << "public " << (is_final ? "sealed " : "") << "partial class " << tstruct->get_name() << " : "; @@ -482,11 +489,12 @@ void t_csharp_generator::generate_csharp_struct_definition(ofstream &out, t_stru indent() << "public Isset __isset;" << endl << indent() << "#if !SILVERLIGHT" << endl << indent() << "[Serializable]" << endl; - if (wcf_) { + out << + indent() << "#endif" << endl; + if ((serialize_||wcf_)) { indent(out) << "[DataContract]" << endl; } out << - indent() << "#endif" << endl << indent() << "public struct Isset {" << endl; indent_up(); for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) { @@ -525,7 +533,7 @@ void t_csharp_generator::generate_csharp_struct_definition(ofstream &out, t_stru out << endl; // generate a corresponding WCF fault to wrap the exception - if(wcf_ && is_exception) { + if((serialize_||wcf_) && is_exception) { generate_csharp_wcffault(out, tstruct); } @@ -539,8 +547,8 @@ void t_csharp_generator::generate_csharp_wcffault(ofstream& out, t_struct* tstru out << endl; indent(out) << "#if !SILVERLIGHT" << endl; indent(out) << "[Serializable]" << endl; - indent(out) << "[DataContract]" << endl; indent(out) << "#endif" << endl; + indent(out) << "[DataContract]" << endl; bool is_final = (tstruct->annotations_.find("final") != tstruct->annotations_.end()); indent(out) << "public " << (is_final ? "sealed " : "") << "partial class " << tstruct->get_name() << "Fault" << endl; @@ -1761,7 +1769,7 @@ void t_csharp_generator::generate_property(ofstream& out, t_field* tfield, bool generate_csharp_property(out, tfield, isPublic, generateIsset, "_"); } void t_csharp_generator::generate_csharp_property(ofstream& out, t_field* tfield, bool isPublic, bool generateIsset, std::string fieldPrefix) { - if(wcf_ && isPublic) { + if((serialize_||wcf_) && isPublic) { indent(out) << "[DataMember]" << endl; } indent(out) << (isPublic ? "public " : "private ") << type_name(tfield->get_type()) @@ -2027,5 +2035,6 @@ std::string t_csharp_generator::get_enum_class_name(t_type* type) { THRIFT_REGISTER_GENERATOR(csharp, "C#", " async: Adds Async CTP support.\n" " wcf: Adds bindings for WCF to generated classes.\n" +" serial: Add serialization support to generated classes.\n" ) diff --git a/lib/csharp/src/Collections/THashSet.cs b/lib/csharp/src/Collections/THashSet.cs index e2fc8b52..b71a8d23 100644 --- a/lib/csharp/src/Collections/THashSet.cs +++ b/lib/csharp/src/Collections/THashSet.cs @@ -21,14 +21,23 @@ using System; using System.Collections; using System.Collections.Generic; +#if SILVERLIGHT +using System.Runtime.Serialization; +#endif + namespace Thrift.Collections { -#if !SILVERLIGHT - [Serializable] +#if SILVERLIGHT + [DataContract] +#else + [Serializable] #endif public class THashSet : ICollection { #if NET_2_0 || SILVERLIGHT +#if SILVERLIGHT + [DataMember] +#endif TDictSet set = new TDictSet(); #else HashSet set = new HashSet(); @@ -79,8 +88,14 @@ namespace Thrift.Collections } #if NET_2_0 || SILVERLIGHT +#if SILVERLIGHT + [DataContract] +#endif private class TDictSet : ICollection { +#if SILVERLIGHT + [DataMember] +#endif Dictionary> dict = new Dictionary>(); public int Count -- 2.17.1