SData 優雅的資料交換方案

2022-07-03 12:42:13 字數 4402 閱讀 7893

sdata的**是

資料交換方案可以分為兩類:有綱要(schema)的和無綱要的。有綱要的資料交換方案有google的protocol buffers,microsoft的bond以及sdata,綱要編譯器在編譯時刻把綱要與程式語言進行對映,也就是通過綱要生成程式語言**,此類方案是靜態型別化的。無綱要的資料交換方案有json(我知道存在json schema,但它並不在編譯階段起作用),序列化器(serializer)在執行時刻把資料與程式語言進行對映,此類方案是動態型別化的。靜態型別化的資料交換方案的優點是型別安全和高效能,缺點是不夠靈活,這和靜態型別化的程式語言與動態型別化的程式語言的差異類似。

sdata的綱要語言優雅強大,物件導向,型別豐富,**生成機制優美靈活。下面是通過示例來介紹sdata。

1)你需要visual studio 2015。

4)載入專案,開啟"add new item"對話方塊 -> visual c# items -> sdata, 新建乙個sdata綱要檔案,將下面的**拷貝到該檔案中:

綱要檔案的副檔名是sds

namespace ""//命名空間由uri標識

class customer extends person//繼承

enum reputation as int32//列舉的underlying型別

class order key id

class supplier extends person

}namespace "/api"

}

編譯專案時,sdata綱要編譯器會檢查綱要檔案的正確性:

5)將sdata runtime library nuget package新增到專案中:

pm> install-package sdata -pre
6)在c#檔案中,使用sdata.schemanamespaceattribute特性指定綱要命名空間到c#命名空間的對映:

using sdata;

[assembly: schemanamespace(""/*綱要命名空間uri*/,

"example.business"/*c#命名空間名字*/)]

//所有的綱要命名空間必須被對映

[assembly: schemanamespace("/api", "example.business.api")]

編譯專案時,sdata綱要編譯器在檢查了綱要檔案的正確性後,會解析c#檔案,並在__sdatagenerated.cs檔案中生成**,開啟並檢視該檔案。

7)使用生成的**非常簡單,將下面的**拷貝到program.cs中:

using system;

using system.collections.generic;

using system.diagnostics;

using system.io;

using sdata;

using example.business;

using example.business.api;

[assembly: schemanamespace("", "example.business")]

[assembly: schemanamespace("/api", "example.business.api")]

class program

, reputation = reputation.bronze,

orders = new hashset,

new order ,}},

new customer

,new supplier

,bankaccount="11223344", products = new dictionary,,}

}},etag = new byte ,

};using (var writer = new streamwriter("dataset.txt"))

dataset result;

var context = new loadingcontext();

using (var reader = new streamreader("dataset.txt"))

debug.assert(false);}}

}}

8)開啟並檢視dataset.txt(注釋是我新增的):

//sdata資料格式示例

//乙個資料檔案必須包含且僅包含乙個類資料

, ,

],},

(a0::customer) ,

(a0::supplier) ,

],etag = "aqidbaugbwg=",

}

9)在行var context = new loadingcontext();設定乙個斷點,當程式執行到斷點時,開啟修改儲存dataset.txt檔案,比如刪除行name = @"tank",,因為屬性name的型別不是nullable,即該屬性是必須的,tryload()將會失敗,下面的診斷資訊將列印在控制台:

error -293: property 'name' missing.

**dataset.txt**: (23,9)-(23,9)

10)因為每個生成的c#類都標註了partial修飾符,自定義**可以新增到c#類中:

namespace example.business

public abstract void mymethod();

}partial class customer}}

11)可以新增自定義驗證:

using system;

using sdata;

public class myloadingcontext : loadingcontext

public override void reset()

}public enum mydiagnosticcode

namespace example.business

//onloaded() is called just after all properties are set

private bool onloaded(loadingcontext context, textspan textspan)

return true;

//if error diagnostics are added to the context, the method must return false.

//if any onloading() or onloaded() returns false, tryload() will return false immediately }}

partial class customer

//the serializer will call base method(person.onloaded()) first

private bool onloaded(loadingcontext context, textspan textspan)

return true;}}

}

//...

var context = new myloadingcontext() ;

using (var reader = new streamreader("dataset.txt"))

public string name

[schemaproperty("phones")]

private collection_phones;

public collectionphones}}

partial class supplier

}}namespace example.business.api}}

sdata.schemanamespaceattributesdata.schemaclassattributesdata.schemapropertyattribute是編譯時特性,它們與執行時無關,這算是元程式設計。

資料交換 電路交換

為什麼要資料交換 那麼有幾個問題 1.n 2鏈路問題,有n個網路要相互連線 之後就想了乙個辦法,產生交換裝置進行連線 這樣子還有個問題,距離,連通性的問題 這樣就產生了交換網路 動態分配傳輸資源 實現資料從源主機穿越交換網路到達目的機 資料交換的型別 電路交換 報文交換 分組交換 最典型電路交換網路...

資料交換技術

廣域網研究的重點就是寬頻核心交換技術。從交換技術的發展歷史看,資料交換經歷了電路交換 報文交換 分組交換和綜合業務數字交換的發展過程。分組交換實質上是在 儲存 基礎上發展起來的。它兼有電路交換和報文交換的優點。常說的分組交換也就是儲存 方式中的報文分組交換方式。包括資料報方式和虛電路方式。資料報類似...

分割槽資料交換

資料交換表面看上去是兩個段裡面的資料進行交換,其實就是資料字典的交換,但是表結構必須一樣 下面乙個例子交換分割槽和索引 建立分割槽 create table part index example x number y number,data varchar2 20 partition by rang...