Я не знаю ни о каких параметрах API для перехода к двоичному файлу haxe
, но предполагалось, что это будет HAXEPATH environment variable
, на который вы могли бы сослаться с помощью Sys.getEnv()
? [ 118]
В противном случае вы можете запустить процесс, найти путь и записать его в файл:
function getHaxeBinPath () : String {
var path = switch ( Sys.systemName () ) {
case "Windows":
// Windows Script.
case "Linux":
Sys.command ( "echo $( which haxe ) >> exePath.txt" );
Sys.io.File.getContent ( "exePath.txt" );
case "BSD":
// BSD Script.
case "Mac":
// Macintosh Script.
default:
throw "Unknown Operating System!";
}
if ( sys.FileSystem.exists ( "exePath.txt" ) {
sys.FileSystem.deleteFile ( "exePath.txt" );
}
return path;
}
, но тогда вам потребуется сценарий для каждой операционной системы и учетная запись для версии вещей. Если вы решите пойти по этому пути, я думаю, что в Windows есть команда WHERE , которую вы могли бы использовать, но я не очень много знаю о ней.
Это не похоже на то, что оно будет работать на * nix (из-за необходимости входа / выхода для обновления переменных среды), но вы могли бы установить переменную среды в обработать, а затем получить его с Sys.getEnv()
? Та же проблема с созданием пользовательских вещей для каждой ОС.
Во-первых, существует очевидный маршрут простого создания реляционной структуры и отображения объекта к полям в базе данных.
Во-вторых, если у Вас есть объект, который является сериализуемым, можно сохранить его в SQL-сервере. Я сделал это при случае и использовал Тип данных text в SQL Server для хранения XML.
Мнение: Я предпочитаю хранить сериализованные объекты как XML вместо двоичных данных. Почему? Поскольку можно на самом деле считать то, что там (для отладки), и в SQL Server можно использовать XQuery для выбора данных из сериализованного объекта. На основе моего опыта увеличение производительности использования двоичных данных не будет стоить того по сравнению с наличием данных, которые легче отладить и могут использоваться psuedo-реляционным способом. Смотрите на возможности SQL Server XQuery. Даже если Вы не планируете использование его сразу же, нет никакой причины поместить себя в угол.
Вы могли бы посмотреть на некоторые примеры с помощью NetDataContractSerializer.
Я верю тому, что Вы называете, вектором является Список <> в C#. Смотрите в Системе. Наборы. Универсальный. Можно использовать NetDataContractSerializer для сериализации Списка 3 строк как:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.IO;
namespace SerializeThingy
{
class Program
{
static void Main(string[] args)
{
List<string> myList = new List<string>();
myList.Add("One");
myList.Add("Two");
myList.Add("Three");
NetDataContractSerializer serializer = new NetDataContractSerializer();
MemoryStream stream = new MemoryStream();
serializer.Serialize(stream, myList);
stream.Position = 0;
Console.WriteLine(ASCIIEncoding.ASCII.GetString(stream.ToArray()));
List<string> myList2 = (List<string>)serializer.Deserialize(stream);
Console.WriteLine(myList2[0]);
Console.ReadKey();
}
}
}
Этот пример просто сериализирует список, производит сериализацию к консоли и затем доказывает, что это гидратировалось правильно на обороте. Я думаю, что Вы видите, что отсюда могли или вывести поток памяти в строку и записать, что к базе данных, или используют другой потоковый тип, чем поток памяти, чтобы сделать это.
Не забудьте ссылаться на Систему. Время выполнения. Сериализация для получения доступа к NetDataContractSerializer.
[Serializable]
public struct Vector3
{
public double x, y, z;
}
class Program
{
static void Main(string[] args)
{
Vector3 vector = new Vector3();
vector.x = 1;
vector.y = 2;
vector.z = 3;
MemoryStream memoryStream = new MemoryStream();
BinaryFormatter binaryFormatter = new BinaryFormatter();
binaryFormatter.Serialize(memoryStream, vector);
string str = System.Convert.ToBase64String(memoryStream.ToArray());
//Store str into the database
}
}
Принятие объектов отмечено с [Serializable]
или реализация ISerializable
BinaryFormatter
класс уступает простому дорогу, чтобы сделать это.
В противном случае Вы выглядите на (не тривиальными) пользовательский код.
Если Вы собираетесь делать это (и я предполагаю, что это технически возможно), Вы могли бы точно также использовать плоский файл: нет никакого смысла в использовании реляционной базы данных больше.
Вот другой более общий подход для универсальных списков. Отметьте, фактический тип, сохраненный в списке, должен также быть сериализуемым
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
using System.Data.SqlClient;
using System.Runtime.Serialization;
public byte[] SerializeList<T>(List<T> list)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, list);
ms.Position = 0;
byte[] serializedList = new byte[ms.Length];
ms.Read(serializedList, 0, (int)ms.Length);
ms.Close();
return serializedList;
}
public List<T> DeserializeList<T>(byte[] data)
{
try
{
MemoryStream ms = new MemoryStream();
ms.Write(data, 0, data.Length);
ms.Position = 0;
BinaryFormatter bf = new BinaryFormatter();
List<T> list = bf.Deserialize(ms) as List<T>;
return list;
}
catch (SerializationException ex)
{
// Handle deserialization problems here.
Debug.WriteLine(ex.ToString());
return null;
}
}
Затем в клиентском коде:
List<string> stringList = new List<string>() { "January", "February", "March" };
byte[] data = SerializeList<string>(stringList);
Один основной способ хранить/получать этот массив байтов мог состоять в том, чтобы использовать простые объекты SQLClient:
SqlParameter param = new SqlParameter("columnName", SqlDbType.Binary, data.Length);
param.Value = data;
etc...
У меня есть больше опыта с реляционными базами данных, чем c#, но двоичная сериализация является приемлемым способом пойти, поскольку это позволяет состоянию всего объекта быть сохраненным в базу данных. Сериализация XML является в значительной степени тем же, хотя универсальные типы не позволяются.