Skip to content

Commit f152ff8

Browse files
Merge pull request #46 from Build5Nines/dev
v2.0.2
2 parents 16c3af4 + f0eedbb commit f152ff8

15 files changed

Lines changed: 303 additions & 37 deletions

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
55
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

8+
## 2.0.2 (2025-04-15)
9+
10+
Add:
11+
12+
- Add `SerializeToBinaryStream` and `DeserializeFromBinaryStream` methods to replace (and mark obselete) `SerializeToJsonStream` and `DeserializeFromJsonStream` methods. They read/write binary zip file data, not json, so they were named incorrectly.
13+
14+
Fixed:
15+
16+
- Fixed `.LoadFromFile` method that was previously inaccessible.
17+
818
## 2.0.1 (2025-03-17)
919

1020
Added:

docs/docs/persistence.md

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Data Persistence
2+
3+
The `Build5Nines.SharpVector` library provides easy-to-use methods for saving a memory-based vector database to a file or stream and loading it again later. This is particularly useful for caching indexed content between runs, deploying pre-built vector stores, or shipping databases with your application.
4+
5+
## File Persistence
6+
7+
`Build5Nines.SharpVector` supports persisting the vector database to a file.
8+
9+
### Save to File
10+
11+
To persist your `BasicMemoryVectorDatabase` to disk, use the `SaveToFile` or `SaveToFileAsync` methods:
12+
13+
```csharp
14+
var vdb = new BasicMemoryVectorDatabase();
15+
16+
var filePath = "vectordata.b59vdb";
17+
18+
// persist vector database to file asynchronously
19+
await vdb.SaveToFileAsync(filePath);
20+
21+
// -- or --
22+
23+
// persist vector database to file
24+
vdb.SaveToFile(filePath);
25+
```
26+
27+
### Load from File
28+
29+
To load a previously saved vector database from disk, use the `LoadFromFile` or `LoadFromFileAsync` methods:
30+
31+
```csharp
32+
var vdb = new BasicMemoryVectorDatabase();
33+
34+
var filePath = "vectordata.b59vdb";
35+
36+
// load vector database from file
37+
vdb.LoadFromFile(filePath);
38+
39+
// -- or --
40+
41+
// load vector database from file asynchronously
42+
await vdb.LoadFromFileAsync(filePath);
43+
```
44+
45+
## Persist to Stream
46+
47+
The underlying methods used by `SaveToFile` and `LoadFromFile` methods for serializing the vector database to a `Stream` are available to use directly. This provides support for reading/writing to `MemoryStream` (or other streams) if the vector database needs to be persisted to something other than the local file system.
48+
49+
!!! info
50+
These `SerializeToBinaryStream` and `DeserializeFromBinaryStream` methods are available in `v2.0.2` and later.
51+
52+
### Write to Stream
53+
54+
To persist your `BasicMemoryVectorDatabase` to a JSON stream, use the `SerializeToBinaryStream` or `SerializeToBinaryStreamAsync` methods:
55+
56+
```csharp
57+
var vdb = new BasicMemoryVectorDatabase();
58+
59+
var stream = new MemoryStream();
60+
61+
// serialize to JSON stream
62+
vdb.SerializeToBinaryStream(stream);
63+
64+
// -- or --
65+
66+
// serialize asynchronously to JSON stream
67+
await vdb.SerializeToBinaryStreamAsync(stream);
68+
```
69+
70+
### Read from Stream
71+
72+
To load your `BasicMemoryVectorDatabase` from JSON stream, use the `DeserializeFromBinaryStream` and `DeserializeFromBinaryStreamAsync` methods:
73+
74+
```csharp
75+
// Be sure Stream position is at the start
76+
stream.Position = 0;
77+
78+
// deserialize from JSON stream
79+
vdb.DeserializeFromBinaryStream(stream);
80+
81+
// -- or ---
82+
83+
// deserialize asynchronously from JSON stream
84+
await vdb.DeserializeFromBinaryStreamAsync(stream);
85+
```

docs/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ nav:
101101
- Get Started: get-started.md
102102
- Concepts: concepts.md
103103
- Text Chunking: text-chunking.md
104+
- Persistence: persistence.md
104105
- OpenAI Embeddings: openai-embeddings.md
105106
- Samples: samples.md
106107
- Resources: resources.md

src/Build5Nines.SharpVector.OpenAI/Build5Nines.SharpVector.OpenAI.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<PackageId>Build5Nines.SharpVector.OpenAI</PackageId>
1010
<PackageProjectUrl>https://sharpvector.build5nines.com</PackageProjectUrl>
1111
<RepositoryUrl>https://github.com/Build5Nines/SharpVector</RepositoryUrl>
12-
<Version>2.0.0</Version>
12+
<Version>2.0.2</Version>
1313
<Description>Lightweight In-memory Vector Database to embed in any .NET Applications that integrates with OpenAI Embedding model for vector generation.</Description>
1414
<Copyright>Copyright (c) 2025 Build5Nines LLC</Copyright>
1515
<PackageReadmeFile>README.md</PackageReadmeFile>
@@ -24,7 +24,7 @@
2424
</ItemGroup>
2525

2626
<ItemGroup>
27-
<PackageReference Include="Build5Nines.SharpVector" Version="[2.0.0,3.0.0)" />
28-
<PackageReference Include="OpenAI" Version="2.1.0" />
27+
<PackageReference Include="Build5Nines.SharpVector" Version="[2.0.2,3.0.0)" />
28+
<PackageReference Include="OpenAI" Version="[2.1.0,3.0.0]" />
2929
</ItemGroup>
3030
</Project>

src/Build5Nines.SharpVector.OpenAI/OpenAIMemoryVectorDatabaseBase.cs

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,13 +251,19 @@ private async Task<IEnumerable<VectorTextResultItem<TMetadata>>> CalculateVector
251251
return results;
252252
}
253253

254-
/// <summary>
254+
[Obsolete("Use SerializeToBinaryStreamAsync Instead")]
255+
public virtual async Task SerializeToJsonStreamAsync(Stream stream)
256+
{
257+
await SerializeToBinaryStreamAsync(stream);
258+
}
259+
260+
/// <summary>
255261
/// Serializes the Vector Database to a JSON stream
256262
/// </summary>
257263
/// <param name="stream"></param>
258264
/// <returns></returns>
259265
/// <exception cref="InvalidOperationException"></exception>
260-
public virtual async Task SerializeToJsonStreamAsync(Stream stream)
266+
public virtual async Task SerializeToBinaryStreamAsync(Stream stream)
261267
{
262268
var streamVectorStore = new MemoryStream();
263269
var streamVocabularyStore = new MemoryStream();
@@ -296,16 +302,28 @@ public virtual async Task SerializeToJsonStreamAsync(Stream stream)
296302
await stream.FlushAsync();
297303
}
298304

305+
[Obsolete("Use SerializeToBinaryStream Instead")]
299306
public virtual void SerializeToJsonStream(Stream stream)
307+
{
308+
SerializeToBinaryStream(stream);
309+
}
310+
311+
public virtual void SerializeToBinaryStream(Stream stream)
300312
{
301313
if (stream == null)
302314
{
303315
throw new ArgumentNullException(nameof(stream));
304316
}
305-
SerializeToJsonStreamAsync(stream).Wait();
317+
SerializeToBinaryStreamAsync(stream).Wait();
306318
}
307319

320+
[Obsolete("Use DeserializeFromBinaryStreamAsync Instead")]
308321
public virtual async Task DeserializeFromJsonStreamAsync(Stream stream)
322+
{
323+
await DeserializeFromBinaryStreamAsync(stream);
324+
}
325+
326+
public virtual async Task DeserializeFromBinaryStreamAsync(Stream stream)
309327
{
310328
if (stream == null)
311329
{
@@ -374,13 +392,19 @@ public virtual async Task DeserializeFromJsonStreamAsync(Stream stream)
374392
}
375393
}
376394

395+
[Obsolete("Use DeserializeFromBinaryStream Instead")]
377396
public virtual void DeserializeFromJsonStream(Stream stream)
397+
{
398+
DeserializeFromBinaryStream(stream);
399+
}
400+
401+
public virtual void DeserializeFromBinaryStream(Stream stream)
378402
{
379403
if (stream == null)
380404
{
381405
throw new ArgumentNullException(nameof(stream));
382406
}
383-
DeserializeFromJsonStreamAsync(stream).Wait();
407+
DeserializeFromBinaryStreamAsync(stream).Wait();
384408
}
385409

386410
}

src/Build5Nines.SharpVector/Build5Nines.SharpVector.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<PackageId>Build5Nines.SharpVector</PackageId>
1010
<PackageProjectUrl>https://sharpvector.build5nines.com</PackageProjectUrl>
1111
<RepositoryUrl>https://github.com/Build5Nines/SharpVector</RepositoryUrl>
12-
<Version>2.0.1</Version>
12+
<Version>2.0.2</Version>
1313
<Description>Lightweight In-memory Vector Database to embed in any .NET Applications</Description>
1414
<Copyright>Copyright (c) 2025 Build5Nines LLC</Copyright>
1515
<PackageReadmeFile>README.md</PackageReadmeFile>

src/Build5Nines.SharpVector/IVectorDatabase.cs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Reflection.Metadata;
2+
13
namespace Build5Nines.SharpVector;
24

35
public interface IVectorDatabase<TId, TMetadata, TDocument>
@@ -85,33 +87,47 @@ public interface IVectorDatabase<TId, TMetadata, TDocument>
8587
Task<IVectorTextResult<TDocument, TMetadata>> SearchAsync(TDocument queryText, float? threshold = null, int pageIndex = 0, int? pageCount = null);
8688

8789

90+
[Obsolete("Use SerializeToBinaryStreamAsync Instead")]
91+
Task SerializeToJsonStreamAsync(Stream stream);
92+
93+
[Obsolete("Use SerializeToBinaryStream Instead")]
94+
void SerializeToJsonStream(Stream stream);
95+
96+
[Obsolete("Use DeserializeToBinaryStreamAsync Instead")]
97+
Task DeserializeFromJsonStreamAsync(Stream stream);
98+
99+
[Obsolete("Use DeserializeToBinaryStream Instead")]
100+
void DeserializeFromJsonStream(Stream stream);
101+
102+
103+
88104
/// <summary>
89105
/// Serializes the Database to a JSON stream
90106
/// </summary>
91107
/// <param name="stream"></param>
92108
/// <returns></returns>
93-
Task SerializeToJsonStreamAsync(Stream stream);
109+
Task SerializeToBinaryStreamAsync(Stream stream);
94110

95111
/// <summary>
96112
/// Serializes the Database to a JSON stream
97113
/// </summary>
98114
/// <param name="stream"></param>
99115
/// <returns></returns>
100-
void SerializeToJsonStream(Stream stream);
116+
void SerializeToBinaryStream(Stream stream);
101117

102118
/// <summary>
103119
/// Deserializes the Database from a JSON stream
104120
/// </summary>
105121
/// <param name="stream"></param>
106122
/// <returns></returns>
107-
Task DeserializeFromJsonStreamAsync(Stream stream);
123+
Task DeserializeFromBinaryStreamAsync(Stream stream);
108124

109125
/// <summary>
110126
/// Deserializes the Database from a JSON stream
111127
/// </summary>
112128
/// <param name="stream"></param>
113129
/// <returns></returns>
114-
void DeserializeFromJsonStream(Stream stream);
130+
void DeserializeFromBinaryStream(Stream stream);
115131
}
116132

117133
public interface IVectorDatabase<TId, TMetadata>
Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System.Text;
2+
13
namespace Build5Nines.SharpVector;
24

35
public static class IVectorDatabaseExtensions
@@ -7,7 +9,7 @@ public static async Task SaveToFileAsync<TId, TMetadata, TDocument>(this IVector
79
{
810
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
911
{
10-
await vectorDatabase.SerializeToJsonStreamAsync(stream);
12+
await vectorDatabase.SerializeToBinaryStreamAsync(stream);
1113
}
1214
}
1315

@@ -16,7 +18,7 @@ public static void SaveToFile<TId, TMetadata, TDocument>(this IVectorDatabase<TI
1618
{
1719
using (var stream = new FileStream(filePath, FileMode.Create, FileAccess.Write))
1820
{
19-
vectorDatabase.SerializeToJsonStream(stream);
21+
vectorDatabase.SerializeToBinaryStream(stream);
2022
}
2123
}
2224

@@ -25,16 +27,16 @@ public static async Task LoadFromFileAsync<TId, TMetadata, TDocument>(this IVect
2527
{
2628
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
2729
{
28-
await vectorDatabase.DeserializeFromJsonStreamAsync(stream);
30+
await vectorDatabase.DeserializeFromBinaryStreamAsync(stream);
2931
}
3032
}
3133

32-
public static void LoadFromFile<TId, TMetadata, TDocument>(IVectorDatabase<TId, TMetadata, TDocument> vectorDatabase, string filePath)
34+
public static void LoadFromFile<TId, TMetadata, TDocument>(this IVectorDatabase<TId, TMetadata, TDocument> vectorDatabase, string filePath)
3335
where TId : notnull
3436
{
3537
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
3638
{
37-
vectorDatabase.DeserializeFromJsonStream(stream);
39+
vectorDatabase.DeserializeFromBinaryStream(stream);
3840
}
3941
}
4042
}

src/Build5Nines.SharpVector/MemoryVectorDatabase.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,17 +33,30 @@ public MemoryVectorDatabase()
3333
)
3434
{ }
3535

36+
37+
[Obsolete("Use DeserializeFromBinaryStreamAsync instead.")]
3638
public override async Task DeserializeFromJsonStreamAsync(Stream stream)
3739
{
38-
await base.DeserializeFromJsonStreamAsync(stream);
40+
await DeserializeFromBinaryStreamAsync(stream);
41+
}
42+
43+
[Obsolete("Use DeserializeFromBinaryStream instead.")]
44+
public override void DeserializeFromJsonStream(Stream stream)
45+
{
46+
DeserializeFromBinaryStream(stream);
47+
}
48+
49+
public override async Task DeserializeFromBinaryStreamAsync(Stream stream)
50+
{
51+
await base.DeserializeFromBinaryStreamAsync(stream);
3952

4053
// Re-initialize the IdGenerator with the max Id value from the VectorStore
4154
_idGenerator = new IntIdGenerator(VectorStore.GetIds().Max());
4255
}
4356

44-
public override void DeserializeFromJsonStream(Stream stream)
57+
public override void DeserializeFromBinaryStream(Stream stream)
4558
{
46-
base.DeserializeFromJsonStream(stream);
59+
base.DeserializeFromBinaryStream(stream);
4760

4861
// Re-initialize the IdGenerator with the max Id value from the VectorStore
4962
_idGenerator = new IntIdGenerator(VectorStore.GetIds().Max());

0 commit comments

Comments
 (0)