Means serialization-deserialization in ICSSoft.STORMNET.Windows.Forms.Utils
In the Assembly ICSSoft.STORMNET.Windows.Forms
class is implemented ICSSoft.STORMNET.Windows.Forms.Utils
, providing, inter alia, methods for serialization-deserialization, which are applicable including for parental control. These methods are a wrapper over the respective methods of Assembly ICSSoft.STORMNET.Tools
, and perform it.
The serialization methods of the class ICSSoft.STORMNET.Windows.Forms.Utils
:
ObjectToString
Assign: Serialize to a string using SoapFormatter
.
Settings:
o
Object
The result is: String.
Signature:
public static string ObjectToString(object o)
{
return ICSSoft.STORMNET.Tools.ToolXML.ObjectToString(o);
}
ObjectFromString
Assign: Deserialize from a string with SoapFormatter
.
Settings:
s
- Serialized object
The result is: the Restored object.
Signature:
public static object ObjectFromString(string s)
{
return ICSSoft.STORMNET.Tools.ToolXML.ObjectFromString(s);
}
ObjectToBinaryString
Assign: Serialize to a string using BinaryFormatter
.
Settings:
o
Object
The result is: String.
Signature:
public static string ObjectToBinaryString(object o)
{
return ICSSoft.STORMNET.Tools.ToolBinarySerializer.ObjectToString(o);
}
ObjectFromBinaryString
Assign: Deserialize from a string with BinaryFormatter
(if it does not, then try SoapFormatter
- for compatibility with legacy data).
Settings:
s
- Serialized object
The result is: the Restored object.
Signature:
public static object ObjectFromBinaryString(string s)
{
object retObj;
try
{
retObj = ICSSoft.STORMNET.Tools.ToolBinarySerializer.ObjectFromString(s);
}
catch
{
retObj = ICSSoft.STORMNET.Tools.ToolXML.ObjectFromString(s);
}
return retObj;
}
On [form constraint] while maintaining (recovery) LimitFunction are used Utils.ObjectToBinaryString
(Utils.ObjectFromBinaryString
), i.e. restrictions are serialized using binary serialization, and restored as a binary string, and SOAP, as in earlier versions of the technology have used the SOAP serialization.
An example SOAP serialization LimitFunction
Function fn = FunctionBuilder.BuildAnd(
FunctionBuilder.BuildEquals("Parampampam", "who goes to visit in the morning"),
FunctionBuilder.BuildOr(
FunctionBuilder.BuildEquals("Compositepicture", Environment.UserName),
FunctionBuilder.BuildIsNull("Nationair")
)
);
string serializedFn = Utils.ObjectToString((new ExternalLangDef()).FunctionToSimpleStruct(fn));
Assert.IsNotNull(serializedFn);
Console.WriteLine(serializedFn);
Function восставшийИзНебытия = (
new ExternalLangDef()).FunctionFromSimpleStruct(Utils.ObjectFromString(serializedFn));
Assert.IsNotNull(восставшийИзНебытия);
An example of binary serialization LimitFunction
This type of serialization is more productive and the rows get shorter.
string fnStr = "";
string serializedFn;
AdvansedLimit advlimit = new AdvansedLimit();
ExternalLangDef externalLangDef = ExternalLangDef.LanguageDef;
advlimit.FromSimpleValue(Utils.ObjectFromString(_serializedFunc), externalLangDef);
Function fn = advlimit.Function;
serializedFn = Utils.ObjectToBinaryString(externalLangDef.FunctionToSimpleStruct(fn));
Assert.IsNotNull(serializedFn);
восставшийИзНебытия =
externalLangDef.FunctionFromSimpleStruct(Utils.ObjectFromBinaryString(serializedFn));
Assert.IsNotNull(восставшийИзНебытия);
Possible problem deserializing
In the above code is used to design advlimit.FromSimpleValue
, which is based on the object of a special type builds directly limit. In the structure of the transmitted object is a special type, among others, have AssemblyQualifiedName
type, which can cause problems during deserialization: for example, if the constraint was created with an unsigned Assembly, you want to open already with the version that was signed (respectively, AssemblyQualifiedName
the type of change and it is impossible to get through Type.GetType(...)
), etc. For this case, added a delegate that allows you to define your own additional method to get type by its name.
namespace ICSSoft.STORMNET.Windows.Forms
{
public class ExternalLangDef
{
/// <summary> Delegate for getting the type by its name in the method SimpleValueToDataObject </summary>
public static TypeResolveDelegate ExtraTypeResolver = null;
//...
}
/// <summary>
/// Delegate to retrieve a type by its name (used in special cases when the standard methods somehow)
/// </summary>
/// <param name="typeName">type Name.</param>
/// <returns> Generated name of the type </returns>
public delegate Type TypeResolveDelegate(string typeName);
}
Below is an example of using this delegate:
// ...
var obj = ICSSoft.STORMNET.Windows.Forms.Utils.ObjectFromBinaryString(data);
var advansedLimit = new AdvansedLimit();
var externalLangDef = new ExternalLangDef();
ExternalLangDef.ExtraTypeResolver = ExtraTypeResolver;
advansedLimit.FromSimpleValue(obj, externalLangDef);
ExternalLangDef.ExtraTypeResolver = null;
var result = advansedLimit;
//...
}
private Type ExtraTypeResolver(string typeName)
{
if (typeName == "IIS.University.Videokasete University(Objects), Version=1.0.0.1, Culture=neutral, PublicKeyToken=null")
{
return typeof(IIS.University.ВидПодразделения);
}
return null;
}