WCF 序列化与反序列化复杂类型

WCF 序列化与反序列化复杂类型
WCF 序列化与反序列化复杂类型

WCF 序列化与反序列化复杂类型(DataContractSerializer)

NET的类型可以分为两种:声明类型和真实类型。我们提倡面向接口的编程,对象的真实类型往往需要在运行时才能确定,在编程的时候往往只需要指明类型的声明类型,比如类型实现的接口或者抽象类。当我们使用基于接口或者抽象类创建的DataContractSerializer去序列化一个实现了该接口或者继承该抽象类的实例的时候,往往会因为对对象的真实类型无法识别造成不能正常地序列化。

现在,我们定义两个带数据协定的类——ActionInfo和ActionParameterInfo:[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

///

/// 动作信息

///

[DataContract(Namespace = "https://www.360docs.net/doc/5c17523712.html,/jiankunking")]

[KnownType("GetKnowTypes")]

//[KnownType("GetKnowTypesQuote")]

public class ActionInfo

{

private string actionName;

///

/// 动作名称

///

[DataMember]

public String ActionName

{

get { return actionName; }

set { actionName = value; }

}

private string actionId;

///

/// 动作唯一标识

///

[DataMember]

public String ActionId

{

get { return actionId; }

set { actionId = value; }

}

private Dictionary actionParameters;

///

/// 参数信息

///

[DataMember]

public Dictionary ActionParameters

{

get

{

if (actionParameters == null)

{

actionParameters = new Dictionary();

}

return actionParameters;

}

set

{

actionParameters = value;

}

}

static Type[] GetKnowTypes()

{

return new Type[] { typeof(Dictionary) };

}

//[DataMember]

//public object Quote;

//static Type[] GetKnowTypesQuote()

//{

// return new Type[] { typeof(Dictionary) };

//}

}

///

/// 动作参数

///

//[DataContract(Namespace = "https://www.360docs.net/doc/5c17523712.html,/jiankunking")] [DataContract]

public class ActionParameterInfo

{

private bool parameterAllowDBNull;

///

/// 参数是否允许为空

///

//[DataMember(Name = "参数是否允许为空", Order = 2)]

[DataMember]

public bool ParameterAllowDBNull

{

get { return parameterAllowDBNull; }

set { parameterAllowDBNull = value; }

}

private ActionInfoParameterCategoryEnum parameterCategory;

///

/// 参数分类

///

//[DataMember(Name = "参数分类", Order = 3)]

[DataMember]

public ActionInfoParameterCategoryEnum ParameterCategory

{

get { return parameterCategory; }

set { parameterCategory = value; }

}

private object parameterValue;

///

/// 参数值

///

//[DataMember(Name = "参数值", Order = 1)]

[DataMember]

public object ParameterValue

{

get { return parameterValue; }

set { parameterValue = value; }

}

private string parameterCode;

///

/// 参数编号(未添加DataMember标识)

///

public string ParameterCode

{

get { return parameterCode; }

set { parameterCode = value; }

}

public enum ActionInfoParameterCategoryEnum

{

[Description("普通类型")]

CommonType = 0,

[Description("事件源")]

EventSource = 1,

[Description("事件参数")]

EventArgument = 2,

[Description("控件ID")]

ControlId = 3,

[Description("表单ID")]

FormId = 4

}

在代码中添加以下代码填充实体类:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

ActionInfo ac = new ActionInfo();

ac.ActionId = "ActionId" + Guid.NewGuid().ToString();

ac.ActionName = "ActionName" + Guid.NewGuid().ToString();

ac.ActionParameters = new Dictionary();

for (int i = 0; i < 2; i++)

{

ActionParameterInfo ap = new ActionParameterInfo();

ap.ParameterAllowDBNull = false;

ap.ParameterCategory = https://www.360docs.net/doc/5c17523712.html,monType;

ap.ParameterValue = Guid.NewGuid();

ac.ActionParameters.Add(ap.ParameterValue.ToString(), ap);

}

测试序列化:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

string ss = PubXmlSerializer.ToXMLString(ac);

生成的xml如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片

ActionIdb9da9159-068e-4cae-9810-5e2ca4f0a87f

ActionName70737f3b-1672-437e-8ad5-543038ac62b4

4e059222-023f-40aa-b08e-42e377570092

false

CommonType

4e059222-023f-40aa-b08e-42e37 7570092

5c528920-a7c6-4fc4-8632-a2f083d43676

false

CommonType

5c528920-a7c6-4fc4-8632-a2f08 3d43676

从xml看到:

DataContractSerializer在默认的情况下采用了如下的序列化规则。

1、XML的根节点名称为数据契约类型的名称。

2、默认的命名空间采用的格式为https://www.360docs.net/doc/5c17523712.html,/2004/07/DataContractSerializerDemo (数据契约类型的命名空间)。

3、只有显示地应用了DataMemberAttributue特性的字段或属性才能作为数据成员参与序列化。

4、所有数据成员均以XML元素的形式被序列化。

5、序列化后数据成员在XML中的次序采用这样的规则:父类数据成员在前,子类数据成员在后;定义在同一个类型中的数据成员按照字母排序。

如果默认序列化后的xml结构不能满足我们的需求,则可以通过DataContractAttribute 和DataMenmberAttribute这两个特性对其进行修正。在下面我们通过DataContractAttribute 特性设置了数据契约的名称和命名空间,通过DataMenmberAttribute特性的Name属性为Name和Birthday两个属性设置不同于属性名称的数据成员名称,并通过Order控制数据成员的先后次序。

修改ActionParameterInfo类:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

///

/// 动作参数

///

[DataContract(Namespace = "https://www.360docs.net/doc/5c17523712.html,/jiankunking")]

public class ActionParameterInfo

{

private bool parameterAllowDBNull;

///

/// 参数是否允许为空

///

[DataMember(Name = "参数是否允许为空", Order = 2)]

public bool ParameterAllowDBNull

{

get { return parameterAllowDBNull; }

set { parameterAllowDBNull = value; }

}

private ActionInfoParameterCategoryEnum parameterCategory;

///

/// 参数分类

///

[DataMember(Name = "参数分类", Order = 3)]

public ActionInfoParameterCategoryEnum ParameterCategory

{

get { return parameterCategory; }

set { parameterCategory = value; }

}

private object parameterValue;

///

/// 参数值

///

[DataMember(Name = "参数值", Order = 1)]

public object ParameterValue

{

get { return parameterValue; }

set { parameterValue = value; }

}

private string parameterCode;

///

/// 参数编号(未添加DataMember标识)

///

public string ParameterCode

{

get { return parameterCode; }

set { parameterCode = value; }

}

再次序列化,xml结构如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片

ActionIdd95e434d-4f13-49b7-859e-a7964f468d70

ActionNamef750900a-42fe-4586-9688-768cdefd4d78

560e9e05-2c7d-482a-89f5-ea200bbe42b3

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">560e9e05-2c7d-482a-89f5-ea200 bbe42b3

<参数是否允许为空>false

<参数分类>CommonType

eac9bc48-be0c-4c36-92d0-8f392f010516

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">eac9bc48-be0c-4c36-92d0-8f392 f010516

<参数是否允许为空>false

<参数分类>CommonType

有木有发现DataMember中Name与Order的作用啊大笑

小注:

对于一些比较复杂的类型无法序列化、反序列化(不能识别类型)的时候,就得考虑使用KnownTypeAttribute来标注可能涉及到的外部类型,但如果遇到像泛型这些较为复杂的类型,就要考虑在带数据协定的类中添加一个静态方法,该方法返回Type 的IEnumerable,一般是Type[]就可以了,而在KnownTypeAttribute的构造函数中使用这个方法的名字。

在该demo中将ActionInfo修改为如下形式(即去掉static Type[] GetKnowTypes()函数,直接标识属性类型)也是可以正常序列化反序列化的:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

///

/// 动作信息

///

[DataContract(Namespace = "https://www.360docs.net/doc/5c17523712.html,/jiankunking")]

//[KnownType("GetKnowTypes")]

//[KnownType("GetKnowTypesQuote")

[KnownType(typeof(Dictionary))]

public class ActionInfo

{

private string actionName;

///

/// 动作名称

///

[DataMember]

public String ActionName

{

get { return actionName; }

set { actionName = value; }

}

private string actionId;

///

/// 动作唯一标识

///

[DataMember]

public String ActionId

{

get { return actionId; }

set { actionId = value; }

}

private Dictionary actionParameters;

///

/// 参数信息

///

[DataMember]

public Dictionary ActionParameters

{

get

{

if (actionParameters == null)

{

actionParameters = new Dictionary();

}

return actionParameters;

}

set

{

actionParameters = value;

}

}

//static Type[] GetKnowTypes()

//{

// return new Type[] { typeof(Dictionary) };

//}

//[DataMember]

//public object Quote;

//static Type[] GetKnowTypesQuote()

//{

// return new Type[] { typeof(Dictionary) };

//}

}

修改实体类后的序列化xml如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片

ActionId394e78b1-0cad-4726-9d6d-6061b7082571

ActionName05ddd5d3-4c08-4bf9-ae7d-2166625dee94

ebb9c44f-69c8-4a52-b59d-7cd8da066591

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">ebb9c44f-69c8-4a52-b59d-7cd8d a066591

<参数是否允许为空>false

<参数分类>CommonType

1a9f70f8-cf38-4644-a466-6afba99b8837

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">1a9f70f8-cf38-4644-a466-6afba9 9b8837

<参数是否允许为空>false

<参数分类>CommonType

那可不可以去掉KnownType标识呢?答案是不可以的。

那么在ActionInfo类中是否可以定义两个已知类型呢?

经过测试验证,不能再同一个类中定义两个已知类型,比如:

错误信息如下:

[plain] view plain copy 在CODE上查看代码片派生到我的代码片

---------------------------

---------------------------

System.Runtime.Serialization.InvalidDataContractException: 类型“SerializationDemo.ActionInfo”的KnownTypeAttribute 特性指定一个名为“GetKnowTypes”的方法,以提供已知类型。此类型上找不到静态方法“GetKnowTypes()”。请确保此方法存在并标记为静态。

System.Runtime.Serialization.DataContract.DataContractCriticalHelper.ThrowInvalidDataContra ctException(String message, Type type)

在System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(Type type, Dictionary`2 typesChecked, Dictionary`2& knownDataContracts)

在System.Runtime.Serialization.DataContract.ImportKnownTypeAttributes(Type type)

System.Runtime.Serialization.ClassDataContract.ClassDataContractCriticalHelper.get_KnownDat aContracts()

在System.Runtime.Serialization.ClassDataContract.get_KnownDataContracts()

System.Runtime.Serialization.XmlObjectSerializerWriteContext.SerializeWithoutXsiType(DataC ontract dataContract, XmlWriterDelegator xmlWriter, Object obj, RuntimeTypeHandle

declaredTypeHandle)

System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObjectContent(XmlW riterDelegator writer, Object graph)

System.Runtime.Serialization.Json.DataContractJsonSerializer.InternalWriteObject(XmlWriterDel egator writer, Object graph)

System.Runtime.Serialization.XmlObjectSerializer.InternalWriteObject(XmlWriterDelegator writer, Object graph, DataContractResolver dataContractResolver)

System.Runtime.Serialization.XmlObjectSerializer.WriteObjectHandleExceptions(XmlWriterDele gator writer, Object graph, DataContractResolver dataContractResolver)

System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject(XmlDictionaryWriter writer, Object graph)

在System.Runtime.Serialization.Json.DataContractJsonSerializer.WriteObject(Stream stream, Object graph)

在SerializationDemo.JsonSerializer.JsonStringSerializer[T](T t) 位置E:\WorkSpace\WorkSpaceTest\SerializationDemo\SerializationDemo\JsonSerializer.cs:行号29

---------------------------

确定

---------------------------

但是对于同一个类型,在一个类中可以有多个属性,比如:

填充实体类代码如下:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

ActionInfo ac = new ActionInfo();

ac.ActionId = "ActionId" + Guid.NewGuid().ToString();

ac.ActionName = "ActionName" + Guid.NewGuid().ToString();

ac.ActionParameters = new Dictionary();

for (int i = 0; i < 2; i++)

{

ActionParameterInfo ap = new ActionParameterInfo();

ap.ParameterAllowDBNull = false;

ap.ParameterCategory = https://www.360docs.net/doc/5c17523712.html,monType;

ap.ParameterValue = https://www.360docs.net/doc/5c17523712.html,Guid();

ac.ActionParameters.Add(ap.ParameterValue.ToString(), ap);

}

ac.ActionParameters1 = new Dictionary();

for (int i = 0; i < 2; i++)

{

ActionParameterInfo ap = new ActionParameterInfo();

ap.ParameterAllowDBNull = false;

ap.ParameterCategory = https://www.360docs.net/doc/5c17523712.html,monType;

ap.ParameterValue = Guid.NewGuid();

ac.ActionParameters1.Add(ap.ParameterValue.ToString(), ap);

}

序列化之后的xml如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片

ActionIded35fdb5-0c47-440e-9d6e-8dba364d49d5

ActionNamef991e495-7cc2-43a2-863f-4a9c139641b1

aec5004a-79d3-4949-8c70-eb7605aa6702

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">aec5004a-79d3-4949-8c70-eb76 05aa6702

<参数是否允许为空>false

<参数分类>CommonType

d859df4f-1b82-4144-9f1b-3a4c01ff1a10

<参数值i:type="b:guid"

xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">d859df4f-1b82-4144-9f1b-3a4c0 1ff1a10

<参数是否允许为空>false

<参数分类>CommonType

110478a6-a177-4dec-bc7f-77027bd30bd3

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">110478a6-a177-4dec-bc7f-77027 bd30bd3

<参数是否允许为空>false

<参数分类>CommonType

cdf8d367-dac4-4ae0-a6b7-d3de0f9fc92a

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">cdf8d367-dac4-4ae0-a6b7-d3de0 f9fc92a

<参数是否允许为空>false

<参数分类>CommonType

如果就是有多个复杂属性如何处理呢?

铛铛==》

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

[KnownType(typeof(Dictionary))]

[KnownType(typeof(Dictionary))]

修改ActionInfo类为:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

///

/// 动作信息

///

[DataContract(Namespace = "https://www.360docs.net/doc/5c17523712.html,/jiankunking")]

//[KnownType("GetKnowTypes")]

//[KnownType("GetKnowTypesQuote")]

//[KnownType(typeof(Dictionary))]

[KnownType(typeof(Dictionary))]

[KnownType(typeof(Dictionary))]

public class ActionInfo

{

private string actionName;

///

/// 动作名称

///

[DataMember]

public String ActionName

{

get { return actionName; }

set { actionName = value; }

}

private string actionId;

///

/// 动作唯一标识

///

[DataMember]

public String ActionId

{

get { return actionId; }

set { actionId = value; }

}

private Dictionary actionParameters;

///

/// 参数信息

///

[DataMember]

public Dictionary ActionParameters

{

get

{

if (actionParameters == null)

{

actionParameters = new Dictionary();

}

return actionParameters;

}

set

{

actionParameters = value;

}

}

//private Dictionary actionParameters1;

/////

///// 参数信息

/////

//[DataMember]

//public Dictionary ActionParameters1

//{

// get

// {

// if (actionParameters1 == null)

// {

// actionParameters1 = new Dictionary();

// }

// return actionParameters1;

// }

// set

// {

// actionParameters1 = value;

// }

//}

//static Type[] GetKnowTypes()

//{

// return new Type[] { typeof(Dictionary) };

//}

[DataMember]

public Dictionary Quote = new Dictionary();

//static Type[] GetKnowTypesQuote()

//{

// return new Type[] { typeof(Dictionary) };

//}

}

填充实体的代码如下:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

ActionInfo ac = new ActionInfo();

ac.ActionId = "ActionId" + Guid.NewGuid().ToString();

ac.ActionName = "ActionName" + Guid.NewGuid().ToString();

ac.ActionParameters = new Dictionary();

for (int i = 0; i < 2; i++)

{

ActionParameterInfo ap = new ActionParameterInfo();

ap.ParameterAllowDBNull = false;

ap.ParameterCategory = https://www.360docs.net/doc/5c17523712.html,monType;

ap.ParameterValue = Guid.NewGuid();

ac.ActionParameters.Add(ap.ParameterValue.ToString(), ap);

}

//ac.ActionParameters1 = new Dictionary();

//for (int i = 0; i < 2; i++)

//{

// ActionParameterInfo ap = new ActionParameterInfo();

// ap.ParameterAllowDBNull = false;

// ap.ParameterCategory = https://www.360docs.net/doc/5c17523712.html,monType;

// ap.ParameterValue = Guid.NewGuid();

// ac.ActionParameters1.Add(ap.ParameterValue.ToString(), ap);

//}

ac.Quote = new Dictionary();

for (int i = 0; i < 2; i++)

{

string str = Guid.NewGuid().ToString();

int f = i;

((Dictionary)ac.Quote).Add(str, f);

}

序列化之后的结果为:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

ActionIdb4df91db-7ba1-480f-bc6f-2dfa3eb27ae7

ActionName30be2364-53d6-429d-8ca4-61dd8928b779

240b226f-8aa0-48e7-a24f-0640e2da7172

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">240b226f-8aa0-48e7-a24f-0640e 2da7172

<参数是否允许为空>false

<参数分类>CommonType

73085803-8d35-4b52-a550-c354f0dae7a0

<参数值i:type="b:guid" xmlns:b="https://www.360docs.net/doc/5c17523712.html,/2003/10/Serialization/">73085803-8d35-4b52-a550-c354 f0dae7a0

<参数是否允许为空>false

<参数分类>CommonType

d9298e16-e41f-4508-a7dc-6a26e137ec2d

0

1a53f746-60fe-4b0b-8c48-479693ad46fa

1

可见,可以通过多个KnownType标识来实现同一个数据契约中多个复杂类型的序列化与反序列化。

此处是以两个字典类型来验证的,其实不管是list还是字典都可以通过:多个KnownType 标识来实现同一个数据契约中多个复杂类型的序列化与反序列化。

KnownType标识类简洁处理方式(这种方式不需要在类上标识KnownType):[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

List knownTypes = new List();

knownTypes.Add(typeof(Dictionary));

knownTypes.Add(typeof(List));

然后调用:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片DataContractSerializer.ToXMLString(ac, knownTypes);

即可

序列化反序列化代码:点击打开链接

Demo代码下载:点击打开链接

DataContractJsonSerializer的用法与DataContractSerializer类似,只是两者对于实体类序列化后的存储形式不一样,仅此而已。

C# WCF DataContractSerializer 类

小注:

如果序列化list即需要序列化一个由baseclass类及其子类组成的集合的时候,需要在子类基类上加上标识:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

[KnownType(typeof(EndEvent))]

public class EndEvent:BpmnEvent

在反序列化的时候,调用:

[csharp] view plain copy 在CODE上查看代码片派生到我的代码片

public static T ReadFromXML(string xmlStr, IEnumerable knownTypes = null) 传入子类基类的的Type。

WebLogic 组件反序列化漏洞补丁升级操作手册

weblogic反序列化补丁安装 梁裕 1、到weblogic官网下载补丁包(p2*******_1036_Generic.zip、 p2*******_1036012_Generic.zip如果找不到的朋友,可以在回复中给我留下邮箱,我会定期回复。) 2、10.3.6对应的补丁包p2*******_1036012_Generic.zip ,补丁包需要依赖于一个大的升级 包,所以需要把p2*******_1036_Generic.zip也下载下来。 3、登录linux的weblogic用户,切换到/home/weblogic/Oracle/Middleware/utils/bsu/目录下。 4、确认当前weblogic版本,并确认所有域的进程全部关闭 ./bsu.sh -prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3/ -status=applied -verbose –view 5、查看是否存在/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir 目录,没有的需要 手工创建。 6、将补丁包上传到/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir目录下 7、首先打大的升级包,解压p2*******_1036_Generic.zip unzip p2*******_1036_Generic.zip EJUW对应就是后面命令的patchlist 8、执行补丁安装命令。 ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=EJUW-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 9、打序列化的补丁包,解压p2*******_1036012_Generic.zip unzip p2*******_1036012_Generic.zip ./bsu.sh -install -patch_download_dir=/home/weblogic/Oracle/Middleware/utils/bsu/cache_dir -patchlist=ZLNA-prod_dir=/home/weblogic/Oracle/Middleware/wlserver_10.3 –verbose 10、在打ZLNA补丁包时,遇到了内存溢出的问题。需要修改bsu.sh脚本,将内存调大。 11、启动weblogic的域,查看输出日志。确定版本是否生效。

java序列化的作用

最近在阅读Core J2EE Patterns 的时候发现例子里用于在各个层次里进行传输的TO(Data Transfer Object)都实现了java.io.Serializable接口,看到这些偶突然感到茅塞顿开~困扰了很久的关于Serializable的疑问渐渐解开了,查找相关资料并总结如下: 序列化是什么: 序列化就是将一个对象的状态(各个属性量)保存起来,然后在适当的时候再获得。 序列化分为两大部分:序列化和反序列化。序列化是这个过程的第一部分,将数据分解成字节流,以便存储在文件中或在网络上传输。反序列化就是打开字节流并重构对象。对象序列化不仅要将基本数据类型转换成字节表示,有时还要恢复数据。恢复数据要求有恢复数据的对象实例 序列化的什么特点: 如果某个类能够被序列化,其子类也可以被序列化。声明为static和transient类型的成员数据不能被序列化。因为static代表类的状态, transient代表对象的临时数据。 什么时候使用序列化: 一:对象序列化可以实现分布式对象。主要应用例如:RMI要利用对象序列化运行远程主机上的服务,就像在本地机上运行对象时一样。 二:java对象序列化不仅保留一个对象的数据,而且递归保存对象引用的每个对象的数据。可以将整个对象层次写入字节流中,可以保存在文件中或在网络连接上传递。利用对象序列化可以进行对象的"深复制",即复制对象本身及引用的对象本身。序列化一个对象可能得到整个对象序列。 ====================== 可以看看接口java.io.serializable的中文解释: Serializable public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。

C++序列化反序列化库Kapok

C++序列化/反序列化库Kapok 1.Kapok的特点 简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack 相当。 它是纯c++11实现,因此需要支持C++11的编译器。 2.主要功能 对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。 //序列化 Serializer sr; auto tp = std::make_tuple(10, 12, string("test")); sr.Serialize(tp, "tuple"); //反序列化 DeSerializer dr; std::tuple p; dr.Parse(sr.GetString()); dr.Deserialize(p, "tuple"); 看起来是不是很简单! 再看一个序列化一个自定义对象的例子。 struct Person { int age; string name; string city; META(age, name, city) }; Person p = { 18, "bb", "aa" }; //序列化 Serializer sr; sr.Serialize(p, "Person"); //反序列化 DeSerializer dr;

Person person; dr.Parse(sr.GetString()); dr.Deserialize(person, "Person"); 一样的很简单,结构这里需要一个宏定义META,这个META的作用就是获取对象的元信息,有了这个元信息我们就可以很方便的实现序列化和反序列化了。 3.应用场景 Kapok除了不支持指针之外所有的对象都支持,支持结构体的无限嵌套(被嵌套的结构体也必须定义META宏)。这里说一下为什么不支持指针呢,因为对象中有指针的话存在两个问题:1.这个指针如果是动态数组的话,c++中无法获取这个数组的长度;2.指针还涉及到内存管理,我希望Kapok专注于序列化和/反序列化,暂时不考虑内存管理。 4.结构体必须有一个宏定义是否具有侵入性? 看起来每个序列化/反序列化的对象都要带一个宏定义似乎侵入性较强,但这种侵入性是完全无害的,因为它只是定义了一个额外的函数而已,这个函数只会在序列化/反序列化的时候才会用到,不会对当前对象造成任何影响,还有一点是因为c++没有反射,必须要通过某种方法来获取对象的元信息,纵观目前所有的序列化方案,只有这种方式是最简洁的,用户做最少的事情即可,这也是我选择这种方式的原因。 5.Kapok是如何实现序列化/反序列化的 Kapok的最底层是用到了rapidjson, 用它来实现对基本类型的序列化,对它做了一个简单的封装以便供上层使用,上面层就是序列化\反序列化实现层,主要是实现对对象元信息的解析和自动化的打包和解包。下面是Kapok序列化的一个示意图: 6.Kapok的性能如何 初步测试对一个tuple进行序列化/反序列化一万次,发现Kapok的耗时和messagepack相当。 7.Kapok是否支持多语言 暂时不支持,先把c++版本做好再说,如果要支持多语言的话,需要用其它语言进行重写,

WCF教程(一)

跟我一起从零开始学WCF(1)
WCF概述
徐长龙 MSDN 特邀讲师 vsts_china@https://www.360docs.net/doc/5c17523712.html,

加速企业解决方案部署尽在
资源和利益
? 用于解决方案开发的集中资源 用于解决方案开发的集中资源:资源包括指向测试工具、开发 资源包括指向测试工具 开发 人员 SDK、技术论坛、联机培训等的链接,微软全球技术支持 中心( (GTSC) )的邮件技术支持。 ? 对市场调查的访问权限:您可以使用这些宝贵信息来识别您当 前的客户或未来客户的特定需求。 ? 认证徽标计划:该徽标可以向客户证明您所具有的优秀技术。 ? 市场营销和销售支持
https://www.360docs.net/doc/5c17523712.html, h O

Metro – ISV领航计划
最先应用微软最新技术 提升ISV 提升 ISV竞争优势和商业价值 竞争优势和商业价值
? Metro 提供了结构化的支持来帮助ISV进行新技术的评估和 部署 部署: Discover – 参与前沿技术培训 – 评估最新的微软技术及产品 Release Learn – 获取微软Beta版产品的技术支持 – 联络全球开发人员和架构师社区 – 与世界级的商务和技术社区分享最先 Develop 部署的经验

收听本次课程需具备的条件
? 熟悉Web Service编程 ? 熟悉Visual Studio 2005/2008 ? 熟悉分布式应用程序开发
Level 200

本次课程内容包括 ? 什么是WCF? ? WCF背景介绍

Apache Shiro反序列化远程代码执行-其他利用姿势

12下一页 返回列表 回复发帖 帖子2 积分1 TCV0 TuBi1 坛龄84天 1# 跳转到? 倒序看帖 打印字体大小: T00LS ? 渗透测试文章(Security Articles) ? 投稿文章:通过Shiro反序列化拿下某空管局服务器root权限 steven 新手上路 发表于 所需阅读权限 20 [【原创】]投稿文章:通过Shiro反序列化拿下某空管局服务器root 权限 xuehei|提醒短消息论坛任务|个人中心退出 首页版块搜索银行T00ls工具帮助

目标站返回rememberMe的cookie字段或者在请求包中含有rememberMe的cookie字段的时候,说明该目标站是用了shiro框架漏洞利用 ①猜解密钥 前文中提到的硬编码的密钥,在实际生产环境中不同的项目可能会存在不同的密钥(key),从github上搜集了部分常用的key用于猜解,这里用到dnslog来判断是否成功. 可以看到当Key为kPH+bIxk5D2deZiIxcaaaA==时,服务器收到了目标站的请求,这里我们可以确定该站的key为 kPH+bIxk5D2deZiIxcaaaA== ②命令执行 这里我们利用ysoserial工具进行漏洞利用. 在服务器上执行 java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2020 CommonsCollections1 'ping -c 1 sl0437.ceye.io' 可以看到已经接收到了目标站的请求,并且payload发送给目标站以后成功执行了ping命令.说明目标站CommonsCollections1存在反序列化漏洞 ③反弹shell 在实战中发现,虽然可以成功执行命令了,但是由于runtime等环境因素并不能直接反弹shell,这个可以采用先下载后运行的方式.

JAVA序列化基础知识Serializable与Externalizable的区别

大家都知道Serializable是一个mark interface,告诉JVM这个对象可以被转换成二进制流来传输. 但是Serializable与Externalizable的转换二进制流的过程是不一样的. Serializable 在我们实现这个接口的时候,我们可以使用4个私有方法来控制序列化的过程: 我们来看一个例子: public class FooImpl implements java.io.Serializable{ private String message; public String getFoo() { return message; } public void setMessage(String message) { this.message = message; } private void writeObject(java.io.ObjectOutputStream out) throws IOException { System.out.println("writeObject invoked"); out.writeObject(this.message == null ? "hohohahaha" : this.message); } private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { System.out.println("readObject invoked"); this.message = (String) in.readObject(); System.out.println("got message:" + message); } private Object writeReplace() throws ObjectStreamException { System.out.println("writeReplace invoked"); return this; } private Object readResolve() throws ObjectStreamException { System.out.println("readResolve invoked"); return this; }

使用json-lib完成json的序列化和反序列化

使用json-lib完成json的序列化和反序列化2011-07-29 14:07:43 分类:默认分类 | 标签:软件 java json. json的序列化和反序列化在现在的javaweb中特别是ajax中使用的比较频繁,现在本人就这种技术提出自己的使用心得。 我的pojo对象的结构是这样的 部门表和员工表 1对多的关系 部门对象 public class Dept implements java.io.Serializable { private Integer depid;//部门ID private String depname;//部门名称 private Set emps = new HashSet(0);//员工集合 } 员工对象 public class Emp implements java.io.Serializable { private Integer empid;//员工id private Dept dept;//部门 private String empname;//员工名称 private Date birthday;//生日 } 1.json字符串序列化成对象 /** *通过json转换成对象 *@author凤生禾予 */ public void jsonToObject(){ Date d=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); StringBuffer str=new StringBuffer(); // json字符串 str.append("{empid:1,dept:{depid:1,depname:'开发部'},empname:'张三 ',birthday:'"+sdf.format(d)+"'}"); // 使用JSONObject将json序列化对象 JSONObject obj=JSONObject.fromObject(str.toString()); // 将JOSNObject对象转换成pojo对象 Emp emp=(Emp) JSONObject.toBean(obj,Emp.class); System.out.println(emp.getBirthday()); } 这里需要注意的是json字符串的写法以{}表示一个对象,字符串必须加引号

WCF服务编程

序 序 (1) 前言 (8) 第1章WCF基础 (13) 什么是WCF (14) 服务 (15) 服务的执行边界 (16) WCF与位置透明度 (17) 地址 (18) TCP地址 (19) HTTP地址 (20) IPC地址 (20) MSMQ地址 (20) 对等网地址 (21) 契约 (21) 服务契约(Service Contract) (21) 数据契约(Data Contract) (21) 错误契约(Fault Contract) (22) 消息契约(Message Contract) (22) 服务契约 (22) 应用ServiceContract特性 (25)

名称与命名空间 (28) 托管 (30) IIS托管 (30) 使用Visual Studio 2005 (31) Web.Config文件 (32) 自托管 (32) 使用Visual Studio 2005 (35) 自托管与基地址 (35) 托管的高级特性 (38) ServiceHost类 (39) WAS托管 (41) 绑定 (41) 标准绑定 (42) 基本绑定(Basic Binding) (43) TCP绑定 (43) 对等网绑定 (43) IPC绑定 (43) WS联邦绑定(Federated WS Binding) (44) WS双向绑定(Duplex WS Binding) (44) MSMQ绑定 (44) 格式与编码 (44) 选择绑定 (45)

使用绑定 (47) 终结点 (47) 管理方式配置终结点 (48) 绑定配置 (52) 编程方式配置终结点 (53) 绑定配置 (56) 元数据交换 (56) 编程方式启用元数据交换 (59) 元数据交换终结点 (62) 编程方式添加MEX终结点 (64) 简化ServiceHost类 (65) 元数据浏览器 (71) 客户端编程 (71) 生成代理 (72) 管理方式配置客户端 (76) 绑定配置 (78) 生成客户端配置文件 (78) 进程内托管配置 (79) SvcConfigEditor编辑器 (80) 创建和使用代理 (81) 关闭代理 (82) 调用超时 (84)

WCF实例

8.2Hello, World实例 本实例与传统入门教材相同,仍然以输出一个“Hello,World”字符串开始。实例将新建2个项目,第一个项目名为“HelloWorldService”,它提供WCF服务,并且以开发环境方式暴露一个端口供客户端调用;另外一个项目叫“HelloWorldClient”,它调用WCF服务方法,并输出返回值。 本实例的运行结果如图所示: 8.2.1创建WCF服务端程序 1)打开Microsoft Visual Studio 2010; 2)选择菜单>文件>新建>项目; 3)在弹出的“新建项目”对话框中展开左边的“已安装的模板”>Visual C#; 4)选择“WCF”; 5)在对话框右边选择“WCF Service Application“; 6)在对话框下部的“项目名“中输入”HelloWorldService“,在位置中输入” d:\Exercise “,在解决方案名称输入”WcfSample“,确保选中”Create directory for solution “,确保未选中”Add to source control“,设置后的界面如下:

7)点击“OK“按钮,VS2010已自动建立了一个WCF Service Application,并且为我们自动打开了Service1.svc.cs文件; 8)打开“Solution Explorer”;(VS2010默认打开,位置在VS2010桌面的右边,如果VS2010没有打开,请使用快捷键Ctrl + W,S打开) 9)在“Solution Explorer”中展开“HelloWorldService”; 10)双击“IService1.cs”文件; 11)用下面的代码 ///

/// 提供一个WCF服务方法 /// /// 返回“Hello, World!” [OperationContract] //声明为“OperationContract”的方法将暴露在WCF服务器上 string GetHelloWorld(); 替换第22行的注释 // TODO: Add your service operations here 知识点: “ServiceContract”代表服务契约,表示IService1接口是一个WCF服务,这样,客户端就可以访问这个接口和它内部有效的方法了。 “OperationContract”代表操作契约,表示GetHelloWorld方法是服务契约中的一个方法,只有声明为“OperationContract”的方法才会被公开在WCF服务中。如果服务中没有任何一个方法声明为“OperationContract”,那么这个服务将没有任何意义。

七步通使用WCF Service流程

七步通使用WCF Service流程 Service对于编程人来说并不陌生,学习了很长时间的WCF,我们现在就WCF Service 一起来和大家分析探讨一下。熟悉Web Service开发的程序员对添加服务引用应该并不陌生。在创建某个服务的客户端程序时,并不需要从头开始编写客户端的底层通信和交互代码,可以通过输入服务地址来添加服务来让Visual Studio生成客户端代理,这样访问服务就像访问本地组件一样,而不需要去关心通信的细节。 如果创建的客户端程序项目和服务程序项目处在同一个解决方案里(很多开发者在开发服务时,也会同步开发客户端程序),还可以通过Visual Studio来帮助我们“发现(Discovery)”服务,并添加服务引用。现在开发WCF Service的程序员也可以得益于这些功能了。如果从WCF Service Library (或者WCF 节点下的Sequential Workflow Service Library 和 State Machine Workflow) 项目模板创建一个项目,那么这些功能就已经具备。 下面我们来看一下如何使用: 1.创建一个客户端程序,可以是一个Windows Console程序。 2.在同一解决方案里添加一个WCF Service Library。如图: 3.Build WcfServiceLibrary1。 4.右键ConsoleApplication1,在上下文菜单中选择“添加服务引用“(Add Service Reference). 5.此时可以看到一个对话框:

6.如果已经知道服务的地址,可以直接在Address栏输入地址来添加服务,单击“Go”。可以找到这个地址对应的服务。 7.如果想添加同一个解决方案里的服务,可以先单击“发现”来寻找服务。找到服务后,选中需要在客户端程序生成引用的服务,然后单击确定,这个时候WcfSvcHost就会自动启动来HOST服务。几秒以后,可以看到客户端自动生成了服务代理代码: 通过上面的步骤在客户端完成了添加服务引用,现在可以访问服务了,只需要通过下面两行代码就可以调用服务端的一个方法: 1.ServiceReference1.Service1Client client = new ServiceReference1.Serv ice1Client(); 2.client.GetData(0);

Win7下使用IIS托管WCF服务

Win7下使用IIS托管WCF服务 第一步,确保Win7正确安装了IIS。 操作步骤: 1.打开控制面板-程序和功能-点击左侧“打开或关闭Windows功能”,在弹出框中选中 “Internet信息服务”,需要注意的是有的需要将其展开,选中相关项。 2.在浏览器中输入http://localhost,如果出现了IIS启动界面,即表示IIS安装成功。 第二步,在进行IIS托管WCF服务之前,先建立一个https://www.360docs.net/doc/5c17523712.html,程序试下。 由于Win7+VS2010使用的是.Net 4.0,所以需要确保注册了https://www.360docs.net/doc/5c17523712.html, 4.0。 操作步骤: 1.进入C:\Windows\System32找到cmd.exe,右键“以管理员身份运行”,然后在控制台输 入:cd C:\Windows\https://www.360docs.net/doc/5c17523712.html,\Framework\v4.0.30319切换到该目录 2.然后输入:aspnet_regiis.exe –i,就会看到正在注册,以及注册成功的提示信息。 备注:最好使用控制台来进行https://www.360docs.net/doc/5c17523712.html,的注册,其实也可以直接以管理员身份运行aspnet_regiis.exe,但是会看不到是否成功的提示! 第三步:创建解决方案,并发布https://www.360docs.net/doc/5c17523712.html,网站 操作步骤: 1.创建一个默认的https://www.360docs.net/doc/5c17523712.html,网站,不用更改其中任何东西。 2.在项目上,右键“属性页”,在“启动选项”中的“特定页”和服务器,进行如下设置: 需要注意的是,这时如果你在项目上右键-在浏览器中查看,会发现不能访问。 3.鼠标右键-发布网站,出现如下图所示对话框:

点击“目标位置”进入如图对话框: 选择“文件系统”,即表示你要将你的网站发布到的本地计算机的位置,在第四步建立网站的时候会引用。 备注:由于,我们没有修改代码,应该发布会很顺利。

Java序列化的机制和原理

Java序列化的机制和原理 有关Java对象的序列化和反序列化也算是Java基础的一部分,下面对Java序列化的机制和原理进行一些介绍。 Java序列化算法透析 Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization 是一种将这些字节重建成一个对象的过程。Java序列化API提供一种处理对象序列化的标准机制。在这里你能学到如何序列化一个对象,什么时候需要序列化以及Java序列化的算法,我们用一个实例来示范序列化以后的字节是如何描述一个对象的信息的。 序列化的必要性 Java中,一切都是对象,在分布式环境中经常需要将Object从这一端网络或设备传递到另一端。这就需要有一种可以在两端传输数据的协议。Java序列化机制就是为了解决这个问题而产生。 如何序列化一个对象 一个对象能够序列化的前提是实现Serializable接口,Serializable接口没有方法,更像是个标记。有了这个标记的Class就能被序列化机制处理。 1.import java.io.Serializable; 2. 3.class TestSerial implements Serializable { 4. 5.public byte version = 100; 6. 7.public byte count = 0; 8. 9.} 然后我们写个程序将对象序列化并输出。ObjectOutputStream能把Object输出成Byte 流。我们将Byte流暂时存储到temp.out文件里。 1.public static void main(String args[]) throws IOException { 2. 3. FileOutputStream fos = new FileOutputStream("temp.out "); 4. 5. ObjectOutputStream oos = new ObjectOutputStream(fos); 6. 7. TestSerial ts = new TestSerial();

Java-Jackson反序列化漏洞及挖洞思路

源码分析Jackson反序列化漏洞 前言: 本次分析从Java序列化和反序列化源码开始分析,进一步分析Jackson源码,找出造成漏洞的原因,最后以Jackson2.9.2版本,JDK1.80_171,resin4.0.52,CVE-2020-10673为例复现漏洞。 一.JA V A反序列化原理 1.1 Class对象 每一个类都有一个Class对象,Class对象包含每一个类的运行时信息,每一个类都有一个Class对象,每编译一个类就产生一个Class对象,Class类没有公共的构造方法,Class对象是在类加载的时候由JVM以及通过调用类加载器中的DefineClass()方法自动构造的,因此不能显式地声明一个Class对象。在类加载阶段,类加载器首先检查这个类的Class对象是否已经被加载。如果尚未加载,默认的类加载器就会根据类的全限定名查找.class文件。一旦某个类的Class对象被载入内存,我们就可以它来创建这个类的所有对象以及获得这个类的运行时信息。 获得Class对象的方法: 1).Class.forName(“类的全名”);//com.xx.xx.xx 2).实例对象.getClass() 3).类名.class 1.2反射 JA V A反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

实现Java反射机制的类都位于https://www.360docs.net/doc/5c17523712.html,ng.reflect包中: 1).Class类:代表一个类 2).Field类:代表类的成员变量(类的属性) 3).Method类:代表类的方法 4).Constructor类:代表类的构造方法 5).Array类:提供了动态创建数组,以及访问数组的元素的静态方法 简单反射调用代码 Class clz=this.getClass(); Object obj= clz.getMethod("方法名",Class对象序列).invoke(this,Object参数序列); 1.3 反序列化 Java 序列化是指把Java 对象转换为字节序列的过程便于保存在内存、文件、数据库中,ObjectOutputStream类的writeObject() 方法可以实现序列化。 Java 反序列化是指把字节序列恢复为Java 对象的过程,ObjectInputStream 类的readObject() 方法用于反序列化。 RMI:是Java 的一组拥护开发分布式应用程序的API,实现了不同操作系统之间程序的方法调用。值得注意的是,RMI 的传输100% 基于反序列化,Java RMI 的默认端口是1099 端口。 JMX:JMX 是一套标准的代理和服务,用户可以在任何Java 应用程序中使用这些代理和服务实现管理,中间件软件WebLogic 的管理页面就是基于JMX 开发的,而JBoss 则整个系统都基于JMX 构架。 只有实现了Serializable接口的类的对象才可以被序列化,Serializable 接口是启用其序列化功能的接口,实现java.io.Serializable 接口的类才是可序列化的,没有实现此接口的类将不能使它们的任一状态被序列化或逆序列化。 readObject() 方法的作用正是从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回,readObject() 是可以重写的,可以定制反序列化的一些行为。 readObject()主要做的事情,其实就是读取正常应该被序列化的字段信息后,

使用WCF实现SOA面向服务编程

作者: 风尘浪子来源: 博客园发布时间: 2011-04-12 11:07 阅读: 3121 次原文链接全屏阅读 [收藏] SOA本身就是一种面向企业级服务的系统架构,简单来说,SOA就是一种进行系统开发的新的体系架构,在基于SOA架构的系统中,具体应用程序的功能是由一些松耦合并且具有统一接口定义方式的组件(也就是service)组合构建起来的。因此,基于SOA的架构也一定是从企业的具体需求开始构建的。但是,SOA和其它企业架构的不同之处就在于SOA提供的业务灵活性。业务灵活性是指企业能对业务变更快速和有效地进行响应、并且利用业务变更来得到竞争优势的能力。对企业级架构设计师来说,创建一个业务灵活的架构意味着创建一个可以满足当前还未知的业务需求的IT架构。使用WCF实现SOA,正好可以利用WCF的灵活性,把业务层封装,发布为Web服务。这样可以降低系统的耦合度,加大对未知业务的扩展性。

Web服务本来就是没有区分代码的,在这个例子里在下多开发了一个Service Interface目的是为了使系统更易于管理。在开发期间,Service是不断更改的,如果在UI层上直接调用服务层,那更改将会是频密的,所以在这里在下开发一个Service Interface层目的是为了把WSDL集成在同一个DLL程序集里面,进行统一修改。最后UI层只要直接调用Service Interface,就可以对系统直接进行操作。要以不同开发工具来实现Service Interface,这个的代价并不大,开销是可以承担的。下面附上最简单的例子,希望有经验的高手给予点评,有不妥的地方请多加指教。

【IT专家】反序列化无效的类

本文由我司收集整编,推荐下载,如有疑问,请与我司联系 反序列化无效的类 反序列化无效的类- 从文件工作反序列化但不是blob?[英]class invalid for deserialization - Deserializes from file working but not blob? The problem lies when trying to deserialize an instance of the class itemSet returned in a resultSet after querying my database. The blobfile seems to be fine itself and the data can be saved to a file then correctly read using a filereader (see below) as such I’m inclined to believe the issue lies somewhere in my implementation? The program runs on tomcat using the netbeans 8.01 ide. ?问题在于在查询数据库后尝试反序列化在resultSet中返回的类itemSet的实例。blobfile本身似乎很好,数据可以保存到文件然后使用文件读取器正确读取(见下文),因为我倾向于认为问题出在我的实现中的某个地方?该程序使用netbeans 8.01 ide在tomcat上运行。 My project git link: https://github/feltax/gw2apiMark2 ?我的项目git链接:https://github/feltax/gw2apiMark2 ?My project is using a modified wrapper for a few classes: https://github/feltax/gw2apiModified ?我的项目使用一个修改过的包装器来完成几个 类:https://github/feltax/gw2apiModified The exact error: ?确切的错误: type Exception report message me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserializationdescription The server encountered an internal error that prevented it from fulfilling this request.exception java.io.InvalidClassException: me.nithanim.gw2api.v2.api.items.ItemInfo; class invalid for deserialization java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.j ava:150)java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790)java.io.

WCF服务如何获取客户端在线用户

本文和大家讲下WCF服务如何获取客户端在线用户数量?你没有关注过这个问题吧,一起来看下本文的实现方法。【1】问题分析: 这个问题,在WCF服务编程中也非常的常见,以下是对于这个问题的不同描述形式,但是本质基本类似:WCF如何获取在线客户端数量? WCF如何获取在线用户列表? WCF服务如何知道客户端离线? 如何判断WCF离线客户端? 或许还有别的提法,但是基本都是差不多的。 此类问题出现在回调、双工通信的场景中比较多,有的程序具备类似聊天室的功能,就比较在乎客户端的离线事件。 【2】解决办法: 这里服务端对于客户端在线的判断,也是固定的,基本是基于对通道状态的判断,来实现对于客户端在线状态的判断。 实现的思路基本就是,在服务端维护一个在线客户端Channel的列表List,然后每次通道关闭(Closed)或者出错(Faulted)调用特定的方法来移调通道。 这里另外一个需要注意的地方就是多线程并发的问题。 因为在线用户通道list是一个静态变量,多线程访问的时候,需要注意互斥操作的问题。 【3】示例代码: 这里的代码页比较简单,基本思路: //回调通道列表,也可以用来保持 private static List channelsList = new List(); private static Object thisLock = new Object(); 另外服务默认的是PerSession实例模式,对于单个客户端Proxy实例只有一个服务。 【3.1】服务端: 这里最重要的就是一个绑定一个方法给Closed事件, OperationContext.Current.Channel.Closed += new EventHandler(ShowOffLine); 全部的代码如下: Code [https://www.360docs.net/doc/5c17523712.html,]using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; using System.Threading; //ServiceContract 属性以及Indigo 使用的所有其他属性均在System.ServiceModel 命名空间中定义, //因此本例开头使用using 语句来引用该命名空间。 namespace WCFService { //1.回调服务契约,由于回调方法在客户端执行,因此无须添加ServiceContractAttribute。对于回调操作,服务器无须获取其返回信息,因此添加IsOneWay=true 特性参数。 public interface IWCFServiceCallBack { //操作契约 [OperationContract(IsOneWay=true)]// void SayHelloCalllBack(); } //2.服务契约,指定CallbackContract 回调契约。 [ServiceContract(CallbackContract = typeof(IWCFServiceCallBack))]

Apache JMeter rmi 反序列化—【CVE-2018-1297】

漏洞描述 Severity: Important Vendor: The Apache Software Foundation Versions Affected: JMeter 2.X, 3.X Description [0]: When using Distributed Test only (RMI based), jmeter uses an unsecured RMI connection. This could allow an attacker to get Access to JMeterEngine and send unauthorized code. This only affect tests running in Distributed mode. Mitigation: Users must use last version of Java 8 or Java 9 Users must upgrade to last JMeter 4.0 version and use the default / enabled authenticated SSL RMI connection. Besides, we remind users that in distributed mode, JMeter makes an Architectural assumption that it is operating on a 'safe' network. i.e. everyone with access to the network is considered trusted. This typically means a dedicated VPN or similar is being used. Example: Start JMeter server using either jmeter-server or jmeter -s If JMeter listens on unsecure rmi connection (ie you can connect to it using a JMeter client), you are vulnerable Apache JMeter 简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器,等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能 流程图

相关文档
最新文档