DICOM文件添加私有Tag(DCMTK Private Tag)

摘要:
将专用标签插入DICOM文件处理DICOM文件时,通常需要插入自定义标签并将其保存为DICOM文件。这里不再重复介绍与dicom相关的dicom文件标记。私有数据元素应按数据元素标签的升序排列在数据集中。私有ID码的VR将变为LO,VM将等于1.II。插入私有标签关于在互联网上插入私有标签的数据和演示很少,它们基本上指向维基百科的一段数据(我们无法得到预期的结果!!!)https://support.dcmtk.org/redmine/projects/dcmtk/wiki/howto_addprivatedata代码如下:1#include“dcmtk/config/osconfig.h”2#include”dcmtk/dcmdata/dctk.h“34#definePRIVATE_ CREATER_NAME”YourCompanyName“56#definePRIVATE_ CREATE _ TAG0x0029,0x00107#definePPRIVATE_ ELEMENT1_ TAG0x0029,1x10008#definePLIVATE_ ELECMENT2_ TAG0x0029,x10109#definePRICATE_ ELEMENT3_ TAG0x0029%,x10201011#definePRV_ PrivateCreatorDcmTag12#definePPRV_PrivateElement1DcmTag13#definePRV_VPrivateElement2DcmTag14#definePRV_VPrivateElement 3DcmTag1516voidregisterPrivateTags()17{18DcmDataDictionary&dict=dcmDataDict.wrlock();19dict.addEntry;20dict.addItem;21dict.addEntry;22dcmDataDict.unlock();23}2425voidaddPrivateElements26{27if(!
                                                                                         DICOM文件插入私有tag

  在处理dicom文件过程中,往往需要插入自定义的tag,并保存为dicom文件。在网上查资料,都比较少,经过一番探索,有点收获。与大家分享,希望能帮助到一些朋友,并共同探讨。

一 dicom文件tag

     相关dicom介绍在这里不做赘述。dicom的Tag,分为两种:1.保留tag,为dicom自有字段,保存在偶数组号中(如 0x0008, 0x0010);2.private tag,为自定义字段,保存在奇数号码中如( 0x0029, 0x0011)。相关介绍在dicom标准的7.8。

7.8  私有数据元素

  实现时可能需要不包含在标准数据元素中的信息通讯。私有数据元素需要包含这些信息。

  私有数据元素与指定在7.1部分(即,数据元素标签字段,可选VR字段,长度字段和值字段)中的标准数据元素有相同的结构。使用在私有数据元素的元素标签中的组号码应该是一个奇数号码。私有数据元素应以数据元素标签的递增数字顺序包含在数据集中。私有数据元素的值字段应具有标准6.2部分中指定的VRs中的任意一种。

  对于每一个信息对象定义或SOP类定义,按照说明在DICOM标准的第3部分和第4部分中的内容,特定数据元素是必需的。私有数据元素不能代替所需的标准数据元素。

7.8.1  私有数据元素标签

  多个实现者定义带有相同(奇数)组号码的情况是可能的。为了避免冲突,私有元素将根据下面的规则来分配私有数据元素标签。

  a)     编号为(gggg,0010-00FF)(gggg为奇数)的私有创作者数据元素用来存储由私人使用的组号码为gggg的一组元素。系统将给这一系列私有元素中的第一个未使用的(未赋值的)元素插入标识码。私有标识码的VR将成为LO,VM将等于1。

  b)     私有创作者数据元素(gggg,0010)是等同于系统存储元素(gggg,1000-10FF)的1类数据元素,私有创作者数据元素(gggg,0011)等同于系统存储元素(gggg,1100-11FF),以此类推,直到私有创作者数据元素(gggg,00FF)等同于系统存储元素  (gggg,FF00-FFFF)。

  c)     私有数据元素的编码器能够动态地将私有数据分配到私有组中的任一可利用块中,并详细说明分配所对应的私有创作者数据元素。私有数据的译码器能够由对应的私有创作者数据元素在私有组中的任何位置使用给定的私有创作者标识码识别存储块。

 

二 插入私有Tag

  网上关于插入私有Tag的资料及demo较少,基本上都指向维基百科的一篇资料(得不到预期结果!!!)     https://support.dcmtk.org/redmine/projects/dcmtk/wiki/howto_addprivatedata,代码如下:

 1 #include "dcmtk/config/osconfig.h" 
 2 #include "dcmtk/dcmdata/dctk.h" 
 3 
 4 #define PRIVATE_CREATOR_NAME "Your Company Name" 
 5 
 6 #define PRIVATE_CREATOR_TAG  0x0029, 0x0010
 7 #define PRIVATE_ELEMENT1_TAG 0x0029, 0x1000
 8 #define PRIVATE_ELEMENT2_TAG 0x0029, 0x1010
 9 #define PRIVATE_ELEMENT3_TAG 0x0029, 0x1020
10 
11 #define PRV_PrivateCreator   DcmTag(PRIVATE_CREATOR_TAG)
12 #define PRV_PrivateElement1  DcmTag(PRIVATE_ELEMENT1_TAG, PRIVATE_CREATOR_NAME)
13 #define PRV_PrivateElement2  DcmTag(PRIVATE_ELEMENT2_TAG, PRIVATE_CREATOR_NAME)
14 #define PRV_PrivateElement3  DcmTag(PRIVATE_ELEMENT3_TAG, PRIVATE_CREATOR_NAME)
15 
16 void registerPrivateTags()
17 {
18   DcmDataDictionary &dict = dcmDataDict.wrlock();
19   dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT1_TAG, EVR_LO, "PrivateText",    1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
20   dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT2_TAG, EVR_US, "PrivateInteger", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
21   dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT3_TAG, EVR_OB, "PrivateBlob",    1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
22   dcmDataDict.unlock();
23 }
24 
25 void addPrivateElements(DcmItem &item)
26 {
27   if (!item.tagExists(PRV_PrivateCreator))
28   {
29     item.putAndInsertString(PRV_PrivateCreator, PRIVATE_CREATOR_NAME);
30     item.putAndInsertString(PRV_PrivateElement1, "Some Text");
31     item.putAndInsertUint16(PRV_PrivateElement2, 12345);
32     item.putAndInsertUint8Array(PRV_PrivateElement3, NULL /*data*/, 0 /*length*/);
33   }
34 }
35 
36 int main()
37 {
38   DcmFileFormat fileformat;
39   fileformat.loadFile("test_in.dcm");
40   registerPrivateTags();
41   addPrivateElements(*fileformat.getDataset());
42   fileformat.saveFile("test_out.dcm", EXS_LittleEndianExplicit);
43   fileformat.print(COUT);
44   return 0;
45 }

   高高兴兴得使用这个demo,结果只能插入PRV_PrivateCreator 字段,做了很多次尝试,结果一样。刚开始怀疑自己哪里出错了,结果在bing上看到一个老哥说遇到跟我一样的问题,意识到可能是代码问题。只好再做其他尝试。

          在看dicom标准过程中,看到一段话:

    a)     编号为(gggg,0010-00FF)(gggg为奇数)的私有创作者数据元素用来存储由私人使用的组号码为gggg的一组元素。系统将给这一系列私有元素中的第一个未使用的(未赋值的)元素插入标识码。私有标识码的VR将成为LO,VM将等于1。

         受到启发,系统将给这一系列私有元素中的第一个未使用的(未赋值的)元素插入标识码。是不是不能使用0x0029, 0x0010标签,应该留给系统插入标识码?(没有依据,纯属猜测)

        于是,修改tag标签地址,不使用0x0010标签:

#define PRIVATE_CREATOR_TAG 0x0029, 0x0011
#define PRIVATE_ELEMENT1_TAG 0x0029, 0x0013
#define PRIVATE_ELEMENT2_TAG 0x0029, 0x0014
#define PRIVATE_ELEMENT3_TAG 0x0031, 0x0010
#define PRIVATE_ELEMENT4_TAG 0x0029, 0x0020

     结果还真能插入多个tag,打印tag信息,可以看到新插入的几个tag。

DICOM文件添加私有Tag(DCMTK Private Tag)第1张

           当以为成功结果问题的时候,遇到了新的问题:插入int型数据不成功。测试代码如下:

DICOM文件添加私有Tag(DCMTK Private Tag)第2张DICOM文件添加私有Tag(DCMTK Private Tag)第3张
 1 #include "dcmtk/config/osconfig.h"
 2 #include "dcmtk/dcmdata/dctk.h"
 3 
 4 #define PRIVATE_CREATOR_NAME "Your Company Name"
 5 
 6 #define PRIVATE_CREATOR_TAG  0x0029, 0x0011
 7 #define PRIVATE_ELEMENT1_TAG 0x0029, 0x0013
 8 #define PRIVATE_ELEMENT2_TAG 0x0029, 0x0014
 9 #define PRIVATE_ELEMENT3_TAG 0x0031, 0x0010
10 #define PRIVATE_ELEMENT4_TAG 0x0029, 0x0020
11 
12 #define PRV_PrivateCreator   DcmTag(PRIVATE_CREATOR_TAG)
13 #define PRV_PrivateElement1  DcmTag(PRIVATE_ELEMENT1_TAG)
14 #define PRV_PrivateElement2  DcmTag(PRIVATE_ELEMENT2_TAG)
15 #define PRV_PrivateElement3  DcmTag(PRIVATE_ELEMENT3_TAG)
16 #define PRV_PrivateElement4  DcmTag(PRIVATE_ELEMENT4_TAG)
17 //#define PRV_PrivateElement1  DcmTag(PRIVATE_ELEMENT1_TAG, PRIVATE_CREATOR_NAME)
18 //#define PRV_PrivateElement2  DcmTag(PRIVATE_ELEMENT2_TAG, PRIVATE_CREATOR_NAME)
19 //#define PRV_PrivateElement3  DcmTag(PRIVATE_ELEMENT3_TAG, PRIVATE_CREATOR_NAME)
20 
21 void registerPrivateTags()
22 {
23     DcmDataDictionary &dict = dcmDataDict.wrlock();
24     dict.addEntry(new DcmDictEntry(PRIVATE_CREATOR_TAG, EVR_US, "PrivateText", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
25     dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT1_TAG, EVR_US, "PrivateText", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
26     dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT2_TAG, EVR_US, "PrivateInteger", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
27     dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT3_TAG, EVR_OB, "PrivateBlob", 1, 1, "private", OFTrue, PRIVATE_CREATOR_NAME));
28     dcmDataDict.unlock();
29 }
30 
31 void addPrivateElements(DcmItem &item)
32 {
33     if (!item.tagExists(PRV_PrivateCreator))
34     {
35         item.putAndInsertString(PRV_PrivateCreator, "WHY");
36     }
37     OFString PrivateCreator;
38     item.findAndGetOFString(PRV_PrivateCreator, PrivateCreator);
39     if (!item.tagExists(PRV_PrivateElement1))
40     {
41         item.putAndInsertString(PRV_PrivateElement1, PRIVATE_CREATOR_NAME);
42     }
43     OFString PrivateElement1;
44     item.findAndGetOFString(PRV_PrivateElement1, PrivateElement1);
45     if (!item.tagExists(PRV_PrivateElement2))
46     {
47       //  item.putAndInsertUint16(PRV_PrivateElement2, 12);
48         item.putAndInsertOFStringArray(PRV_PrivateElement2, "'a','b'");
49     }
50     if (!item.tagExists(PRV_PrivateElement3))
51     {
52         //item.putAndInsertUint16(PRV_PrivateElement3, '10');
53         item.putAndInsertUint16(PRV_PrivateElement3, 10,0,OFTrue);
54     }
55     Uint16 t = 1;
56     item.findAndGetUint16(PRV_PrivateElement3, t);
57     std::cout << "PRV_PrivateElement3: " << t;
58 
59    // item.putAndInsertUint8Array(PRV_PrivateElement3, NULL /*data*/, 0 /*length*/);
60 }
61 
62 int main()
63 {
64     DcmFileFormat fileformat;
65     fileformat.loadFile("D:\te\{832E0B3A-7509-45C2-88BD-3A0BC5C48D04}.dcm");
66   //  registerPrivateTags();
67     addPrivateElements(*fileformat.getDataset());
68     DcmDataDictionary &dict = dcmDataDict.wrlock();
69 
70     dict.addEntry(new DcmDictEntry(PRIVATE_ELEMENT4_TAG, EVR_US, "PrivateText", 1, 2, "private", OFTrue, PRIVATE_CREATOR_NAME));
71     dcmDataDict.unlock();
72 
73 
74     fileformat.getDataset()->putAndInsertString(PRV_PrivateElement4,"PRV_PrivateElement4");
75     #define DCM_W           DcmTagKey(0x0029, 0x0030)
76     fileformat.getDataset()->putAndInsertUint16(DCM_W, 99);
77     fileformat.saveFile("D:\te\test_out.dcm", EXS_LittleEndianExplicit);
78     fileformat.print(COUT);
79     return 0;
80 }
View Code

问题:打印结果,如上,插入的int型tag没有显示出来,插入不成功!!!

#define DCM_W DcmTagKey(0x0029, 0x0030)
fileformat.getDataset()->putAndInsertUint16(DCM_W, 99);

我查看了保留tag的int型tag,插入方式确实是上面的方式,这个可以通过修改某个tag值验证。

验证方式及结果:

如:fileformat.getDataset()->putAndInsertUint16(DCM_Rows, 99); 修改行数

DICOM文件添加私有Tag(DCMTK Private Tag)第4张

可以看到tag信息中的,rows显示为修改值99,原始是704,与columns值一致。

查了不少资料,也没有解决,希望有知道的朋友留言探讨!谢谢

三 将过程数据保存在dicom文件中(序列化,反序列化)

       最开始设想的就是,过程中的参数分为多给private tag插入,因此会遇到string,int,uint16等类型。后来发现,其实可以换个方法实现,将过程数据序列化后,存为一个私有tag。

       过程为:1. 将过程文件序列化,存入dicom中

                   2. 读取dicom文件,解析该私有tag,读取其值,并反序列化,得到原始过程数据。

     我采用的是boost序列方法,可参考 http://zh.highscore.de/cpp/boost/serialization.html,非常详细清晰。

  生成dicom,https://blog.csdn.net/jiangsirl/article/details/7522986

      

      结合起来,写了个demo

DICOM文件添加私有Tag(DCMTK Private Tag)第5张DICOM文件添加私有Tag(DCMTK Private Tag)第6张
  1 #include <boost/archive/text_oarchive.hpp> 
  2 #include <boost/archive/text_iarchive.hpp> 
  3 #include <iostream> 
  4 #include <sstream> 
  5 #include <string>
  6 
  7 #include "dcmtkdcmdatadctk.h"
  8 #include "DCMTKdcmimgledcmimage.h"
  9 
 10 
 11 #pragma comment(linker,"/NOD:LIBCMT")
 12 #pragma comment(lib, "oflog.lib")
 13 #pragma comment(lib, "ofstd.lib")
 14 #pragma comment(lib, "dcmimage.lib")
 15 #pragma comment(lib, "dcmdata.lib")
 16 #pragma comment(lib, "oflog.lib")
 17 #pragma comment(lib, "netapi32.lib")
 18 #pragma comment(lib, "wsock32.lib")
 19 
 20 std::stringstream ss;
 21 using namespace std;
 22 class person
 23 {
 24 public:
 25     person()
 26     {
 27     }
 28 
 29     person(int age)
 30         : age_(age)
 31     {
 32     }
 33 
 34     int age() const
 35     {
 36         return age_;
 37     }
 38 
 39 private:
 40     friend class boost::serialization::access;
 41 
 42     template <typename Archive>
 43     void serialize(Archive &ar, const unsigned int version)
 44     {
 45         ar & age_;
 46     }
 47 
 48     int age_;
 49 };
 50 
 51 void save()
 52 {
 53     boost::archive::text_oarchive oa(ss);
 54     person p(31);
 55     oa << p;
 56 }
 57 
 58 void load()
 59 {
 60     boost::archive::text_iarchive ia(ss);
 61     person p;
 62     ia >> p;
 63     std::cout << p.age() << std::endl;
 64 }
 65 
 66 int main()
 67 {
 68 
 69     char uid[100];
 70     DcmFileFormat fileformat;
 71     DcmMetaInfo *metainfo = fileformat.getMetaInfo();
 72     DcmDataset *dataset = fileformat.getDataset();
 73 
 74     //***meta group******/
 75     metainfo->putAndInsertString(DCM_FileMetaInformationVersion, "us test dcm file");
 76     metainfo->putAndInsertString(DCM_MediaStorageSOPClassUID, UID_RETIRED_UltrasoundImageStorage);
 77     metainfo->putAndInsertString(DCM_MediaStorageSOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
 78     metainfo->putAndInsertString(DCM_TransferSyntaxUID, UID_LittleEndianExplicitTransferSyntax);
 79     metainfo->putAndInsertString(DCM_ImplementationClassUID, "999.999");
 80 
 81     //***identifying group****/
 82     dataset->putAndInsertString(DCM_ImageType, "ORIGINAL\PRIMARY\TEE\0011");
 83     dataset->putAndInsertString(DCM_SOPClassUID, UID_RETIRED_UltrasoundImageStorage);//UID_SecondaryCaptureImageStorage);
 84     dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));
 85     dataset->putAndInsertString(DCM_StudyID, "398474");
 86     dataset->putAndInsertString(DCM_StudyDate, "20100823");
 87     dataset->putAndInsertString(DCM_StudyTime, "080322");
 88     dataset->putAndInsertString(DCM_Modality, "US");//OT
 89 
 90     dataset->putAndInsertString(DCM_Manufacturer, "ACME product");
 91     dataset->putAndInsertString(DCM_ReferringPhysicianName, "ANONY");
 92     dataset->putAndInsertString(DCM_StudyDescription, "STUDY description");
 93     dataset->putAndInsertString(DCM_SeriesDescription, "SERIES DESCRIPTION");
 94     dataset->putAndInsertString(DCM_StageNumber, "1");
 95     dataset->putAndInsertString(DCM_NumberOfStages, "1");
 96     dataset->putAndInsertString(DCM_ViewNumber, "1");
 97     dataset->putAndInsertString(DCM_NumberOfViewsInStage, "1");
 98     /***patient group*****/
 99     dataset->putAndInsertString(DCM_PatientID, "PatientID");
100     dataset->putAndInsertString(DCM_PatientName, "PatientName");
101     dataset->putAndInsertString(DCM_PatientSex, "M");
102     dataset->putAndInsertString(DCM_PatientBirthDate, "20000302");
103 
104     /************************************************************************/
105     /* acquisiton group                                                                     */
106     /************************************************************************/
107     //DCM_ProtocolName
108     /************************************************************************/
109     /* relation group                                                                      */
110     /************************************************************************/
111     dataset->putAndInsertString(DCM_StudyInstanceUID, "999.999.2.19941105.112000");
112     dataset->putAndInsertString(DCM_SeriesInstanceUID, "999.999.2.19941105.112000.2");
113     dataset->putAndInsertString(DCM_SeriesNumber, "2");
114     dataset->putAndInsertString(DCM_AccessionNumber, "1");
115     //dataset->putAndInsertString(DCM_InstanceNumber,);
116 
117     //调窗
118     //dataset->putAndInsertString(DCM_WindowCenter, "256");
119     //dataset->putAndInsertString(DCM_WindowWidth, "128");
120 
121     const int width = 256;
122     const int height = 256;
123     dataset->putAndInsertString(DCM_InstanceNumber, "1");
124     //dataset->putAndInsertString(DCM_PatientOrientation,"HFL");
125     dataset->putAndInsertString(DCM_PhotometricInterpretation, "RGB");
126     dataset->putAndInsertUint16(DCM_SamplesPerPixel, 3);
127     dataset->putAndInsertUint16(DCM_BitsAllocated, 8);
128     dataset->putAndInsertUint16(DCM_BitsStored, 8);
129     dataset->putAndInsertUint16(DCM_HighBit, 7);
130     dataset->putAndInsertUint16(DCM_PixelRepresentation, 0);
131     dataset->putAndInsertUint16(DCM_PlanarConfiguration, 0);
132     dataset->putAndInsertString(DCM_PixelAspectRatio, "4\3");
133     dataset->putAndInsertUint16(DCM_Rows, height);//
134     dataset->putAndInsertUint16(DCM_Columns, width);//
135 
136 #define PRV_PrivateCreator   DcmTag(0x0029, 0x0011)
137     dataset->putAndInsertString(PRV_PrivateCreator, "PRV_PrivateElement4");
138     std::stringstream ss;
139     //boost::archive::text_oarchive oa(ss);
140     //string i = "1111111111111111111111111121213213421fdsafsdagdsagsfdbghfgjdfghjhgjfghjdgh";
141     //oa << i;
142 
143     boost::archive::text_oarchive oa(ss);
144     person p(31);
145     oa << p;
146 
147     cout << "ss:" << ss.str() << endl;
148     dataset->putAndInsertString(PRV_PrivateCreator, ss.str().c_str());
149     fileformat.print(COUT);
150     BYTE* pData = new BYTE[width*height * 3];
151     memset(pData, 0, width*height * 3);
152     for (int y = 0; y < height; y++) {
153         //memset(pData+ y*width*3, y & 0xff0000,width*3);
154         for (int x = 0; x < width * 3; x++)
155         {
156             if (x % 3 == 0)
157                 pData[y*width * 3 + x] = 0xff;
158             else
159                 pData[y*width * 3 + x] = rand() % 256;
160         }
161     }
162     dataset->putAndInsertUint8Array(DCM_PixelData, pData, width*height * 3);
163     delete[] pData;
164     OFCondition status = fileformat.saveFile("d:\test.dcm",
165         EXS_LittleEndianImplicit, EET_UndefinedLength, EGL_withoutGL);
166     if (status.bad())
167     {
168         printf("
 cannot write dicom file");
169         return false;
170     }
171 
172 
173     DcmFileFormat dfile;
174     OFCondition status1;
175     DcmMetaInfo *metainfo1;
176 
177     status1 = dfile.loadFile("d:\test.dcm");
178     metainfo1 = dfile.getMetaInfo();
179     DcmDataset *dset = dfile.getDataset();
180     OFString privateTag;
181     string sPrivate;
182     dset->findAndGetOFString(PRV_PrivateCreator, privateTag);
183     sPrivate = privateTag.c_str();
184     cout << sPrivate << endl;
185 
186     string t = "1122222222222222222222222222222222222";
187     stringstream st;
188     //st << t;
189     //cout << "st:" << st.str() << endl;
190 
191     string as = "ab";
192     stringstream ssPrivate;
193 
194     ssPrivate << sPrivate;
195 
196     //boost::archive::text_iarchive ia(ssPrivate);
197     //string adverse = "c";
198     //ia >> adverse;
199 
200    // cout << "反序列化:" << adverse << endl;
201 
202     boost::archive::text_iarchive ia(ssPrivate);
203     person p1;
204     ia >> p1;
205     std::cout << p1.age() << std::endl;
206 
207 
208     save();
209     load();
210     return 0;
211 }
View Code

打印结果:DICOM文件添加私有Tag(DCMTK Private Tag)第7张

可以看到,序列化输入的为age=31,反序列化得到的age也是31。说明成功将一个类对象,序列化后存入dicom文件,解析该文件的tag,反序列化后可以得到原始值。

大功告成!将自定义结构数据成功存入privateTag中!

转发链接:https://i.cnblogs.com/EditPosts.aspx?postid=9338142

欢迎探讨!

免责声明:文章转载自《DICOM文件添加私有Tag(DCMTK Private Tag)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#调用7z实现文件的压缩与解压支付网关集成(转自Best Payment Gateways)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C# 序列化与反序列化Serialization之Json Xml Binary Soap JavaScript序列化

所谓的序列化其实就是把一个内存中的对象信息转化成一个可以持久化保存的形式,方便保存数据库和文件或着用于传输, 序列化的主要作用是不同平台之间进行通信与信息的传递保存等,常用的有序列化有Json Xml Binary Soap JavaScript序列化等,当然我们也可以使用第三方的序列化类库,第三方的序列化类库可以参照网上的,这里不再赘述, 本文主要介绍J...

Protobuf 语言指南(proto3)

Protobuf 语言指南(proto3)Protocol Buffer是Google的语言中立的,平台中立的,可扩展机制的,用于序列化结构化数据 - 对比XML,但更小,更快,更简单。您可以定义数据的结构化,然后可以使用特殊生成的源代码轻松地在各种数据流中使用各种语言编写和读取结构化数据。 定义消息类型 先来看一个非常简单的例子。假设你想定义一个“搜索...

基于Memcached的tomcat集群session共享所用的jar及多个tomcat各种序列化策略配置

原文:http://www.cnblogs.com/interdrp/p/4096466.html 多个tomcat各种序列化策略配置如下:一、java默认序列化tomcat配置conf/context.xml添加<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManag...

POJO类中布尔类型的变量都不要加is前缀详解

前言 对应阿里巴巴开发手册第一章的命名风格的第八条。 【强制】 POJO类中布尔类型的变量都不要加is前缀,否则部分框架解析会引起序列化错误。 反例:定义为基本数据类型Boolean isDeleted; 的属性,它的方法名称也是 isDeleted(), RPC框架在反向解析的时候,“误以为”对应的属性名称是deleted,导致属性获取不到抛出异常。...

Json.Net序列化和反序列化设置

首先补充一点,Json.Net是支持序列化和反序列化DataTable,DataSet,Entity Framework和NHibernate的.我举例说明DataTable的序列化和反序列化.创建一个DataTable对象,如下: DataTable dt = newDataTable(); DataCol...

表单序列化,获取Json对象

以下方法适用于所有表单元素 1、.serialize() $(selector).serialize()方法通过序列化表单值创建 URL 编码文本字符串 <form> <input type="checkbox" name="username" value="南国"/>南国 <input type="checkbox...