ライセンスファイルを読み書きするためのテストを作成しました。確かに、これは弱いライセンスですが、私がそれを稼働させることができれば、私たちが必要とするものに対してはうまくいくでしょう。シリアル化が作成されたxmlでエラーを返す非直列化
クラスのシリアル化を行ったこのブログが見つかりました。ファイルに保存できるようになりました。ここで私はからの助けを得ているサイト:だから
http://codehandbook.org/c-object-xml/
は、私は、私のクラスを取ってそれからXMLを作成し、それを暗号化し、それをファイルに保存しています。この部分はうまくいくようです。それが作成されます
私のxmlは:
<?xml version=\"1.0\" encoding=\"utf-16\"?>
<ArrayOfCheckObject xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">
<CheckObject>
<Program>Software1</Program>
<CompanyCode>1234</CompanyCode>
<WorkstationId>AA</WorkstationId>
<HardwareId>askldasldfj123234</HardwareId>
</CheckObject>
<CheckObject>
<Program>Software2</Program>
<CompanyCode>23456</CompanyCode>
<WorkstationId>BB</WorkstationId>
<HardwareId>askldwwwwwwwwwww</HardwareId>
</CheckObject>
<CheckObject>
<Program>Software3</Program>
<CompanyCode>4567</CompanyCode>
<WorkstationId>CC</WorkstationId>
<HardwareId>qqqqqqqq123234</HardwareId>
</CheckObject>
</ArrayOfCheckObject>
私は読みやすさのためにそれをフォーマットされています。
私がテストしていた次のステップは、ファイルから読み込み、解読してxmlを自分のクラスに変換することでした。私のクラスへの変換は、エラーがこの行ではどこから来ているように思わ:
obj = serializer.Deserialize(xmlReader); // <--- error occurs here!!
マイエラー:
{System.InvalidOperationException: There is an error in XML document (1, 41). ---> System.InvalidOperationException: <ArrayOfCheckObject xmlns=''> was not expected.
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderCheckObject.Read3_CheckObject()
--- End of inner exception stack trace ---
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
at ObjectCheck.XmlHelper.ObjectToXml(String xml, Type objectType) in c:\tgsource\Suburban Projects\ObjectCheck\ObjectCheck\XmlHelper.cs:line 46}
これはXmlHelperクラスです:
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace ObjectCheck
{
internal static class XmlHelper
{
public static string GetXmlFromObject(object o)
{
StringWriter sw = new StringWriter();
XmlTextWriter tw = null;
try
{
XmlSerializer serializer = new XmlSerializer(o.GetType());
tw = new XmlTextWriter(sw);
serializer.Serialize(tw, o);
}
catch (Exception ex)
{
throw;
}
finally
{
sw.Close();
if (tw != null)
{
tw.Close();
}
}
return sw.ToString();
}
public static Object ObjectToXml(string xml, Type objectType)
{
StringReader strReader = null;
XmlSerializer serializer = null;
XmlTextReader xmlReader = null;
Object obj = null;
try
{
strReader = new StringReader(xml);
serializer = new XmlSerializer(objectType);
xmlReader = new XmlTextReader(strReader);
obj = serializer.Deserialize(xmlReader); // <--- error occurs here!!
}
catch (Exception ex)
{
//Handle Exception Code
}
finally
{
if (xmlReader != null)
{
xmlReader.Close();
}
if (strReader != null)
{
strReader.Close();
}
}
return obj;
}
}
}
マイEncryptionHelperクラス:
using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ObjectCheck
{
internal static class EncryptionHelper
{
public static string Encrypt(string clearText)
{
string EncryptionKey = "12345";
byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
public static string Decrypt(string cipherText)
{
string EncryptionKey = "12345";
cipherText = cipherText.Replace(" ", "+");
byte[] cipherBytes = Convert.FromBase64String(cipherText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
}
cipherText = Encoding.Unicode.GetString(ms.ToArray());
}
}
return cipherText;
}
}
}
上記のクラスをテストする私のメインクラス:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Serialization;
namespace ObjectCheck
{
public class CheckObject
{
public string Program { set; get; }
public string CompanyCode { set; get; }
public string WorkstationId { set; get; }
public string HardwareId { set; get; }
}
public static class ObjectCheck
{
public static Guid Check(CheckObject checkObject)
{
return CheckValue(checkObject);
}
private static Guid CheckValue(CheckObject checkObject)
{
switch (checkObject.Program.ToLower())
{
case "software1":
SaveObjectCheck();
return CheckPropane(checkObject);
break;
default:
return Guid.NewGuid();
break;
}
}
private static void SaveObjectCheck()
{
var obj = new List<CheckObject>();
var obj1 = new CheckObject();
obj1.Program = "Software1";
obj1.CompanyCode = "1234";
obj1.HardwareId = "askldasldfj123234";
obj1.WorkstationId = "AA";
obj.Add(obj1);
var obj2 = new CheckObject();
obj2.Program = "Software2";
obj2.CompanyCode = "2345";
obj2.HardwareId = "askldwwwwwwwwwww";
obj2.WorkstationId = "BB";
obj.Add(obj2);
var obj3 = new CheckObject();
obj3.Program = "Software3";
obj3.CompanyCode = "3456";
obj3.HardwareId = "qqqqqqqq123234";
obj3.WorkstationId = "CC";
obj.Add(obj3);
var xml = XmlHelper.GetXmlFromObject(obj);
var encxml = EncryptionHelper.Encrypt(xml);
using (var sw = new StreamWriter(@"c:\test\ObjectCheck.dat"))
{
sw.Write(encxml);
}
}
private static Guid CheckPropane(CheckObject checkObject)
{
var file = @"c:\test\ObjectCheck.dat";
var readfile = String.Empty;
using (var sr = new StreamReader(file))
{
var read = sr.ReadToEnd();
readfile = EncryptionHelper.Decrypt(read);
}
if (string.IsNullOrEmpty(readfile))
{
return Guid.Empty;
}
//byte[] byteArray = Encoding.UTF8.GetBytes(readfile);
//byte[] byteArray = Encoding.ASCII.GetBytes(contents);
//MemoryStream stream = new MemoryStream(byteArray);
CheckObject mco;
//using (TextReader reader = new StreamReader(readfile))
//{
// XmlSerializer serializer = new XmlSerializer(typeof(CheckObject));
// mco = (CheckObject)serializer.Deserialize(stream);
//}
var co = XmlHelper.ObjectToXml(readfile, typeof(CheckObject));
return Guid.Empty;
}
}
}
何か提案がありますか?
あなたの答えを正しいですし、私はそのコードを修正しましたが、あなたの答えを共同でなしに提示するより良い方法がありますndescending。私はそれを見落として、その答えを求めました。 – ErocM
申し訳ありませんが、私はそれを言い直します。 – Xiaoy312
ありがとう、それは完全に働いた。 – ErocM